summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC/MCDwarf.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2011-05-10 20:59:42 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2011-05-10 20:59:42 +0000
commit99f6735532f78ab9d2da1edd10fb1939cd046f8a (patch)
treecfe7108c5ef69014b7c68af8c55b8a79f818d8e5 /llvm/lib/MC/MCDwarf.cpp
parent2fe0ee1ce2e424311d342c97a7eb37f369199813 (diff)
downloadbcm5719-llvm-99f6735532f78ab9d2da1edd10fb1939cd046f8a.tar.gz
bcm5719-llvm-99f6735532f78ab9d2da1edd10fb1939cd046f8a.zip
On MachO, unlike ELF, there should be no relocation to produce the CIE pointer.
llvm-svn: 131149
Diffstat (limited to 'llvm/lib/MC/MCDwarf.cpp')
-rw-r--r--llvm/lib/MC/MCDwarf.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp
index d0eaf2074c6..7cf6cddd4fd 100644
--- a/llvm/lib/MC/MCDwarf.cpp
+++ b/llvm/lib/MC/MCDwarf.cpp
@@ -502,11 +502,12 @@ namespace {
int CIENum;
bool UsingCFI;
bool IsEH;
+ const MCSymbol *SectionStart;
public:
- FrameEmitterImpl(bool usingCFI, bool isEH) : CFAOffset(0), CIENum(0),
- UsingCFI(usingCFI),
- IsEH(isEH) {
+ FrameEmitterImpl(bool usingCFI, bool isEH, const MCSymbol *sectionStart) :
+ CFAOffset(0), CIENum(0), UsingCFI(usingCFI), IsEH(isEH),
+ SectionStart(sectionStart) {
}
const MCSymbol &EmitCIE(MCStreamer &streamer,
@@ -737,9 +738,9 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
MCContext &context = streamer.getContext();
MCSymbol *fdeStart = context.CreateTempSymbol();
MCSymbol *fdeEnd = context.CreateTempSymbol();
- const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
+ const TargetAsmInfo &TAsmInfo = context.getTargetAsmInfo();
- if (!asmInfo.isFunctionEHFrameSymbolPrivate() && IsEH) {
+ if (!TAsmInfo.isFunctionEHFrameSymbolPrivate() && IsEH) {
MCSymbol *EHSym = context.GetOrCreateSymbol(
frame.Function->getName() + Twine(".eh"));
streamer.EmitEHSymAttributes(frame.Function, EHSym);
@@ -751,15 +752,21 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer,
streamer.EmitAbsValue(Length, 4);
streamer.EmitLabel(fdeStart);
+
// CIE Pointer
+ const MCAsmInfo &asmInfo = context.getAsmInfo();
if (IsEH) {
const MCExpr *offset = MakeStartMinusEndExpr(streamer, cieStart, *fdeStart,
0);
streamer.EmitAbsValue(offset, 4);
+ } else if (!asmInfo.doesDwarfRequireRelocationForSectionOffset()) {
+ const MCExpr *offset = MakeStartMinusEndExpr(streamer, *SectionStart,
+ cieStart, 0);
+ streamer.EmitAbsValue(offset, 4);
} else {
streamer.EmitSymbolValue(&cieStart, 4);
}
- unsigned fdeEncoding = asmInfo.getFDEEncoding(UsingCFI);
+ unsigned fdeEncoding = TAsmInfo.getFDEEncoding(UsingCFI);
unsigned size = getSizeForEncoding(streamer, fdeEncoding);
// PC Begin
@@ -840,15 +847,17 @@ namespace llvm {
void MCDwarfFrameEmitter::Emit(MCStreamer &streamer,
bool usingCFI,
bool isEH) {
- const MCContext &context = streamer.getContext();
+ MCContext &context = streamer.getContext();
const TargetAsmInfo &asmInfo = context.getTargetAsmInfo();
const MCSection &section = isEH ?
*asmInfo.getEHFrameSection() : *asmInfo.getDwarfFrameSection();
streamer.SwitchSection(&section);
+ MCSymbol *SectionStart = context.CreateTempSymbol();
+ streamer.EmitLabel(SectionStart);
MCSymbol *fdeEnd = NULL;
DenseMap<CIEKey, const MCSymbol*> CIEStarts;
- FrameEmitterImpl Emitter(usingCFI, isEH);
+ FrameEmitterImpl Emitter(usingCFI, isEH, SectionStart);
const MCSymbol *DummyDebugKey = NULL;
for (unsigned i = 0, n = streamer.getNumFrameInfos(); i < n; ++i) {
OpenPOWER on IntegriCloud