1Pull in r200376 from upstream llvm trunk (by Venkatraman Govindaraju): 2 3 [Sparc] Use %r_disp32 for pc_rel entries in FDE as well. 4 5 This makes MCAsmInfo::getExprForFDESymbol() a virtual function and overrides it in SparcMCAsmInfo. 6 7Introduced here: http://svnweb.freebsd.org/changeset/base/262261 8 9Index: lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h 10=================================================================== 11--- lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h 12+++ lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h 13@@ -26,6 +26,10 @@ class SparcELFMCAsmInfo : public MCAsmInfoELF { 14 virtual const MCExpr* getExprForPersonalitySymbol(const MCSymbol *Sym, 15 unsigned Encoding, 16 MCStreamer &Streamer) const; 17+ virtual const MCExpr* getExprForFDESymbol(const MCSymbol *Sym, 18+ unsigned Encoding, 19+ MCStreamer &Streamer) const; 20+ 21 }; 22 23 } // namespace llvm 24Index: lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp 25=================================================================== 26--- lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp 27+++ lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp 28@@ -58,3 +58,15 @@ SparcELFMCAsmInfo::getExprForPersonalitySymbol(con 29 30 return MCAsmInfo::getExprForPersonalitySymbol(Sym, Encoding, Streamer); 31 } 32+ 33+const MCExpr* 34+SparcELFMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym, 35+ unsigned Encoding, 36+ MCStreamer &Streamer) const { 37+ if (Encoding & dwarf::DW_EH_PE_pcrel) { 38+ MCContext &Ctx = Streamer.getContext(); 39+ return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32, 40+ MCSymbolRefExpr::Create(Sym, Ctx), Ctx); 41+ } 42+ return MCAsmInfo::getExprForFDESymbol(Sym, Encoding, Streamer); 43+} 44Index: test/CodeGen/SPARC/exception.ll 45=================================================================== 46--- test/CodeGen/SPARC/exception.ll 47+++ test/CodeGen/SPARC/exception.ll 48@@ -57,6 +57,7 @@ 49 ; V8PIC_NOCFI: .section .eh_frame 50 ; V8PIC_NOCFI-NOT: .section 51 ; V8PIC_NOCFI: .word %r_disp32(DW.ref.__gxx_personality_v0) 52+; V8PIC_NOCFI: .word %r_disp32(.Ltmp{{.+}}) ! FDE initial location 53 54 55 ; V9ABS-LABEL: main: 56@@ -94,6 +95,7 @@ 57 ; V9PIC_NOCFI: .section .eh_frame 58 ; V9PIC_NOCFI-NOT: .section 59 ; V9PIC_NOCFI: .word %r_disp32(DW.ref.__gxx_personality_v0) 60+; V9PIC_NOCFI: .word %r_disp32(.Ltmp{{.+}}) ! FDE initial location 61 62 define i32 @main(i32 %argc, i8** nocapture readnone %argv) unnamed_addr #0 { 63 entry: 64Index: include/llvm/MC/MCAsmInfo.h 65=================================================================== 66--- include/llvm/MC/MCAsmInfo.h 67+++ include/llvm/MC/MCAsmInfo.h 68@@ -371,7 +371,7 @@ namespace llvm { 69 unsigned Encoding, 70 MCStreamer &Streamer) const; 71 72- const MCExpr * 73+ virtual const MCExpr * 74 getExprForFDESymbol(const MCSymbol *Sym, 75 unsigned Encoding, 76 MCStreamer &Streamer) const; 77