Add the getExprForFDESymbol method that responsible for computing the
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 28 Apr 2011 21:04:39 +0000 (21:04 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 28 Apr 2011 21:04:39 +0000 (21:04 +0000)
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
include/llvm/MC/MCAsmInfoDarwin.h
lib/MC/MCAsmInfo.cpp
lib/MC/MCAsmInfoDarwin.cpp
lib/MC/MCDwarf.cpp

index 0ea9d01f680915e39207f64f9088a8c4b02c74ee..566535ebacdb842e296949395aea1312dc825cde 100644 (file)
@@ -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;
     }
index 143f205665b161f7462af89a22b435264035681a..634f163d84ecd109c4eab17e80b21f0b69e4dc95 100644 (file)
@@ -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;
   };
 }
 
index 873802ae9806c2deab98120c799385005a589c92..b685c1a264c28702280092ea5fd07f37b4dc7754 100644 (file)
@@ -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());
 }
index 04862fae161a7b71fe05aa7e481cda16b787faac..fea1548f4621108aacc81ba0b99d44eb1102eef6 100644 (file)
@@ -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();
index d677d0c3b61b05870130cdb85c207a2a8bdae614..7111758a72792627c601bb9b3ba31fb74bf45d25 100644 (file)
@@ -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<MCSymbolRefExpr>(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,