summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp')
-rw-r--r--llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp39
1 files changed, 29 insertions, 10 deletions
diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp
index c3a12421dac..067c38a56cd 100644
--- a/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp
+++ b/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp
@@ -6,7 +6,7 @@
//
//===----------------------------------------------------------------------===//
//
-// .
+// MachO parsing support for llvm-jitlink.
//
//===----------------------------------------------------------------------===//
@@ -105,8 +105,6 @@ Error registerMachOStubsAndGOT(Session &S, AtomGraph &G) {
bool isGOTSection = isMachOGOTSection(Sec);
bool isStubsSection = isMachOStubsSection(Sec);
- auto &SectionInfo = FileInfo.SectionInfos[Sec.getName()];
-
auto *FirstAtom = *Sec.atoms().begin();
auto *LastAtom = FirstAtom;
for (auto *DA : Sec.atoms()) {
@@ -115,25 +113,46 @@ Error registerMachOStubsAndGOT(Session &S, AtomGraph &G) {
if (DA->getAddress() > LastAtom->getAddress())
LastAtom = DA;
if (isGOTSection) {
+ if (Sec.isZeroFill())
+ return make_error<StringError>("Content atom in zero-fill section",
+ inconvertibleErrorCode());
+
if (auto TA = getMachOGOTTarget(G, *DA)) {
FileInfo.GOTEntryInfos[TA->getName()] = {DA->getContent(),
DA->getAddress()};
} else
return TA.takeError();
} else if (isStubsSection) {
+ if (Sec.isZeroFill())
+ return make_error<StringError>("Content atom in zero-fill section",
+ inconvertibleErrorCode());
+
if (auto TA = getMachOStubTarget(G, *DA))
FileInfo.StubInfos[TA->getName()] = {DA->getContent(),
DA->getAddress()};
else
return TA.takeError();
- } else if (DA->hasName() && DA->isGlobal())
- S.SymbolInfos[DA->getName()] = {DA->getContent(), DA->getAddress()};
+ } else if (DA->hasName() && DA->isGlobal()) {
+ if (DA->isZeroFill())
+ S.SymbolInfos[DA->getName()] = {DA->getSize(), DA->getAddress()};
+ else {
+ if (Sec.isZeroFill())
+ return make_error<StringError>("Content atom in zero-fill section",
+ inconvertibleErrorCode());
+ S.SymbolInfos[DA->getName()] = {DA->getContent(), DA->getAddress()};
+ }
+ }
}
- const char *StartAddr = FirstAtom->getContent().data();
- const char *EndAddr =
- LastAtom->getContent().data() + LastAtom->getContent().size();
- SectionInfo.TargetAddress = FirstAtom->getAddress();
- SectionInfo.Content = StringRef(StartAddr, EndAddr - StartAddr);
+
+ JITTargetAddress SecAddr = FirstAtom->getAddress();
+ uint64_t SecSize = (LastAtom->getAddress() + LastAtom->getSize()) -
+ FirstAtom->getAddress();
+
+ if (Sec.isZeroFill())
+ FileInfo.SectionInfos[Sec.getName()] = {SecSize, SecAddr};
+ else
+ FileInfo.SectionInfos[Sec.getName()] = {
+ StringRef(FirstAtom->getContent().data(), SecSize), SecAddr};
}
return Error::success();
OpenPOWER on IntegriCloud