[Sparc] Use %r_disp32 for pc_rel entries in FDE as well.
authorVenkatraman Govindaraju <venkatra@cs.wisc.edu>
Wed, 29 Jan 2014 06:59:20 +0000 (06:59 +0000)
committerVenkatraman Govindaraju <venkatra@cs.wisc.edu>
Wed, 29 Jan 2014 06:59:20 +0000 (06:59 +0000)
This makes MCAsmInfo::getExprForFDESymbol() a virtual function and overrides it in SparcMCAsmInfo.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200376 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCAsmInfo.h
lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp
lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h
test/CodeGen/SPARC/exception.ll

index d3f48660ab020b76f94dc7cadff50ca886faf8bd..c36d8585e36134b0fdc783465db57009d2b7d2c5 100644 (file)
@@ -364,7 +364,7 @@ namespace llvm {
                                 unsigned Encoding,
                                 MCStreamer &Streamer) const;
 
-    const MCExpr *
+    virtual const MCExpr *
     getExprForFDESymbol(const MCSymbol *Sym,
                         unsigned Encoding,
                         MCStreamer &Streamer) const;
index 856b4bbf5d17f952d7fac78c837962fa1094e39d..c59486804723b6bb5cbfca930b2bb20db25c8c9e 100644 (file)
@@ -56,3 +56,15 @@ SparcELFMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym,
 
   return MCAsmInfo::getExprForPersonalitySymbol(Sym, Encoding, Streamer);
 }
+
+const MCExpr*
+SparcELFMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym,
+                                       unsigned Encoding,
+                                       MCStreamer &Streamer) const {
+  if (Encoding & dwarf::DW_EH_PE_pcrel) {
+    MCContext &Ctx = Streamer.getContext();
+    return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32,
+                               MCSymbolRefExpr::Create(Sym, Ctx), Ctx);
+  }
+  return MCAsmInfo::getExprForFDESymbol(Sym, Encoding, Streamer);
+}
index 71dcf6bec3520da98ed6d03b8ab14bd1642bbcac..d53d09deee47a4292d38936ea04d243de54c208e 100644 (file)
@@ -26,6 +26,10 @@ public:
   virtual const MCExpr* getExprForPersonalitySymbol(const MCSymbol *Sym,
                                                     unsigned Encoding,
                                                     MCStreamer &Streamer) const;
+  virtual const MCExpr* getExprForFDESymbol(const MCSymbol *Sym,
+                                            unsigned Encoding,
+                                            MCStreamer &Streamer) const;
+
 };
 
 } // namespace llvm
index d6044e199f51b86b7dd68cafd159976b9717c618..fd9e871dd9a235025374119eb89c8267f56e4822 100644 (file)
@@ -57,6 +57,7 @@
 ; V8PIC_NOCFI:        .section .eh_frame
 ; V8PIC_NOCFI-NOT:    .section
 ; V8PIC_NOCFI:        .word %r_disp32(DW.ref.__gxx_personality_v0)
+; V8PIC_NOCFI:        .word %r_disp32(.Ltmp{{.+}}) ! FDE initial location
 
 
 ; V9ABS-LABEL: main:
@@ -94,6 +95,7 @@
 ; V9PIC_NOCFI:        .section .eh_frame
 ; V9PIC_NOCFI-NOT:    .section
 ; V9PIC_NOCFI:        .word %r_disp32(DW.ref.__gxx_personality_v0)
+; V9PIC_NOCFI:        .word %r_disp32(.Ltmp{{.+}}) ! FDE initial location
 
 define i32 @main(i32 %argc, i8** nocapture readnone %argv) unnamed_addr #0 {
 entry: