aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp')
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp49
1 files changed, 40 insertions, 9 deletions
diff --git a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
index 3602601287f4..c85e80b52e5a 100644
--- a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
@@ -81,7 +81,9 @@ Error EHFrameSplitter::processBlock(LinkGraph &G, Block &B,
return Error::success();
}
- BinaryStreamReader BlockReader(B.getContent(), G.getEndianness());
+ BinaryStreamReader BlockReader(
+ StringRef(B.getContent().data(), B.getContent().size()),
+ G.getEndianness());
while (true) {
uint64_t RecordStartOffset = BlockReader.getOffset();
@@ -203,7 +205,9 @@ Error EHFrameEdgeFixer::processBlock(ParseContext &PC, Block &B) {
}
CIEInfosMap CIEInfos;
- BinaryStreamReader BlockReader(B.getContent(), PC.G.getEndianness());
+ BinaryStreamReader BlockReader(
+ StringRef(B.getContent().data(), B.getContent().size()),
+ PC.G.getEndianness());
while (!BlockReader.empty()) {
size_t RecordStartOffset = BlockReader.getOffset();
@@ -267,8 +271,10 @@ Error EHFrameEdgeFixer::processCIE(ParseContext &PC, Block &B,
LLVM_DEBUG(dbgs() << " Record is CIE\n");
- auto RecordContent = B.getContent().substr(RecordOffset, RecordLength);
- BinaryStreamReader RecordReader(RecordContent, PC.G.getEndianness());
+ auto RecordContent = B.getContent().slice(RecordOffset, RecordLength);
+ BinaryStreamReader RecordReader(
+ StringRef(RecordContent.data(), RecordContent.size()),
+ PC.G.getEndianness());
// Skip past the CIE delta field: we've already processed this far.
RecordReader.setOffset(CIEDeltaFieldOffset + 4);
@@ -397,8 +403,10 @@ Error EHFrameEdgeFixer::processFDE(ParseContext &PC, Block &B,
JITTargetAddress RecordAddress = B.getAddress() + RecordOffset;
- auto RecordContent = B.getContent().substr(RecordOffset, RecordLength);
- BinaryStreamReader RecordReader(RecordContent, PC.G.getEndianness());
+ auto RecordContent = B.getContent().slice(RecordOffset, RecordLength);
+ BinaryStreamReader RecordReader(
+ StringRef(RecordContent.data(), RecordContent.size()),
+ PC.G.getEndianness());
// Skip past the CIE delta field: we've already read this far.
RecordReader.setOffset(CIEDeltaFieldOffset + 4);
@@ -730,6 +738,28 @@ Expected<Symbol &> EHFrameEdgeFixer::getOrCreateSymbol(ParseContext &PC,
return PC.G.addAnonymousSymbol(*B, Addr - B->getAddress(), 0, false, false);
}
+char EHFrameNullTerminator::NullTerminatorBlockContent[4] = {0, 0, 0, 0};
+
+EHFrameNullTerminator::EHFrameNullTerminator(StringRef EHFrameSectionName)
+ : EHFrameSectionName(EHFrameSectionName) {}
+
+Error EHFrameNullTerminator::operator()(LinkGraph &G) {
+ auto *EHFrame = G.findSectionByName(EHFrameSectionName);
+
+ if (!EHFrame)
+ return Error::success();
+
+ LLVM_DEBUG({
+ dbgs() << "EHFrameNullTerminator adding null terminator to "
+ << EHFrameSectionName << "\n";
+ });
+
+ auto &NullTerminatorBlock = G.createContentBlock(
+ *EHFrame, NullTerminatorBlockContent, 0xfffffffffffffffc, 1, 0);
+ G.addAnonymousSymbol(NullTerminatorBlock, 0, 4, false, true);
+ return Error::success();
+}
+
EHFrameRegistrar::~EHFrameRegistrar() {}
Error InProcessEHFrameRegistrar::registerEHFrames(
@@ -751,7 +781,7 @@ createEHFrameRecorderPass(const Triple &TT,
StoreFrameRangeFunction StoreRangeAddress) {
const char *EHFrameSectionName = nullptr;
if (TT.getObjectFormat() == Triple::MachO)
- EHFrameSectionName = "__eh_frame";
+ EHFrameSectionName = "__TEXT,__eh_frame";
else
EHFrameSectionName = ".eh_frame";
@@ -768,8 +798,9 @@ createEHFrameRecorderPass(const Triple &TT,
Size = R.getSize();
}
if (Addr == 0 && Size != 0)
- return make_error<JITLinkError>("__eh_frame section can not have zero "
- "address with non-zero size");
+ return make_error<JITLinkError>(
+ StringRef(EHFrameSectionName) +
+ " section can not have zero address with non-zero size");
StoreFrameRange(Addr, Size);
return Error::success();
};