From a0057ca13f06b8de08483c3e3a143a7236c67097 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 28 Apr 2011 21:04:39 +0000 Subject: [PATCH] Add the getExprForFDESymbol method that responsible for computing the expressions used in the FDE to refer to symbols. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130437 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCAsmInfo.h | 3 +++ include/llvm/MC/MCAsmInfoDarwin.h | 3 +-- lib/MC/MCAsmInfo.cpp | 6 ++++++ lib/MC/MCAsmInfoDarwin.cpp | 4 ++-- lib/MC/MCDwarf.cpp | 21 +++++++++------------ 5 files changed, 21 insertions(+), 16 deletions(-) diff --git a/include/llvm/MC/MCAsmInfo.h b/include/llvm/MC/MCAsmInfo.h index 0ea9d01f680..566535ebacd 100644 --- a/include/llvm/MC/MCAsmInfo.h +++ b/include/llvm/MC/MCAsmInfo.h @@ -328,6 +328,9 @@ namespace llvm { getExprForPersonalitySymbol(const MCSymbol *Sym, MCStreamer &Streamer) const; + virtual const MCExpr * + getExprForFDESymbol(const MCSymbol *Sym, MCStreamer &Streamer) const; + bool usesSunStyleELFSectionSwitchSyntax() const { return SunStyleELFSectionSwitchSyntax; } diff --git a/include/llvm/MC/MCAsmInfoDarwin.h b/include/llvm/MC/MCAsmInfoDarwin.h index 143f205665b..634f163d84e 100644 --- a/include/llvm/MC/MCAsmInfoDarwin.h +++ b/include/llvm/MC/MCAsmInfoDarwin.h @@ -26,8 +26,7 @@ namespace llvm { struct MCAsmInfoDarwin : public MCAsmInfo { explicit MCAsmInfoDarwin(); virtual const MCExpr * - getExprForPersonalitySymbol(const MCSymbol *Sym, - MCStreamer &Streamer) const; + getExprForFDESymbol(const MCSymbol *Sym, MCStreamer &Streamer) const; }; } diff --git a/lib/MC/MCAsmInfo.cpp b/lib/MC/MCAsmInfo.cpp index 873802ae980..b685c1a264c 100644 --- a/lib/MC/MCAsmInfo.cpp +++ b/lib/MC/MCAsmInfo.cpp @@ -112,5 +112,11 @@ unsigned MCAsmInfo::getSLEB128Size(int Value) { const MCExpr * MCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym, MCStreamer &Streamer) const { + return getExprForFDESymbol(Sym, Streamer); +} + +const MCExpr * +MCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym, + MCStreamer &Streamer) const { return MCSymbolRefExpr::Create(Sym, Streamer.getContext()); } diff --git a/lib/MC/MCAsmInfoDarwin.cpp b/lib/MC/MCAsmInfoDarwin.cpp index 04862fae161..fea1548f462 100644 --- a/lib/MC/MCAsmInfoDarwin.cpp +++ b/lib/MC/MCAsmInfoDarwin.cpp @@ -61,8 +61,8 @@ MCAsmInfoDarwin::MCAsmInfoDarwin() { } const MCExpr * -MCAsmInfoDarwin::getExprForPersonalitySymbol(const MCSymbol *Sym, - MCStreamer &Streamer) const { +MCAsmInfoDarwin::getExprForFDESymbol(const MCSymbol *Sym, + MCStreamer &Streamer) const { MCContext &Context = Streamer.getContext(); const MCExpr *Res = MCSymbolRefExpr::Create(Sym, Context); MCSymbol *PCSym = Context.CreateTempSymbol(); diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index d677d0c3b61..7111758a727 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -465,19 +465,16 @@ static unsigned getSizeForEncoding(MCStreamer &streamer, static void EmitSymbol(MCStreamer &streamer, const MCSymbol &symbol, unsigned symbolEncoding) { + MCContext &context = streamer.getContext(); + const MCAsmInfo &asmInfo = context.getAsmInfo(); + const MCExpr *v = asmInfo.getExprForFDESymbol(&symbol, + streamer); unsigned size = getSizeForEncoding(streamer, symbolEncoding); unsigned application = symbolEncoding & 0x70; - switch (application) { - default: - assert(0 && "Unknown Encoding"); - break; - case 0: - streamer.EmitSymbolValue(&symbol, size); - break; - case dwarf::DW_EH_PE_pcrel: - streamer.EmitPCRelSymbolValue(&symbol, size); - break; - } + if (isa(v) && application == dwarf::DW_EH_PE_pcrel) + streamer.EmitPCRelValue(v, size); + else + streamer.EmitAbsValue(v, size); } static void EmitPersonality(MCStreamer &streamer, const MCSymbol &symbol, @@ -756,7 +753,7 @@ MCSymbol *FrameEmitterImpl::EmitFDE(MCStreamer &streamer, unsigned size = getSizeForEncoding(streamer, fdeEncoding); // PC Begin - streamer.EmitPCRelSymbolValue(frame.Begin, size); + EmitSymbol(streamer, *frame.Begin, fdeEncoding); // PC Range const MCExpr *Range = MakeStartMinusEndExpr(streamer, *frame.Begin,