1263320SdimPull in r200376 from upstream llvm trunk (by Venkatraman Govindaraju): 2263320Sdim 3263320Sdim [Sparc] Use %r_disp32 for pc_rel entries in FDE as well. 4263320Sdim 5263320Sdim This makes MCAsmInfo::getExprForFDESymbol() a virtual function and overrides it in SparcMCAsmInfo. 6263320Sdim 7269012SemasteIntroduced here: http://svnweb.freebsd.org/changeset/base/262261 8263320Sdim 9263320SdimIndex: lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h 10263320Sdim=================================================================== 11263320Sdim--- lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h 12263320Sdim+++ lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h 13263320Sdim@@ -26,6 +26,10 @@ class SparcELFMCAsmInfo : public MCAsmInfoELF { 14263320Sdim virtual const MCExpr* getExprForPersonalitySymbol(const MCSymbol *Sym, 15263320Sdim unsigned Encoding, 16263320Sdim MCStreamer &Streamer) const; 17263320Sdim+ virtual const MCExpr* getExprForFDESymbol(const MCSymbol *Sym, 18263320Sdim+ unsigned Encoding, 19263320Sdim+ MCStreamer &Streamer) const; 20263320Sdim+ 21263320Sdim }; 22263320Sdim 23263320Sdim } // namespace llvm 24263320SdimIndex: lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp 25263320Sdim=================================================================== 26263320Sdim--- lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp 27263320Sdim+++ lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp 28263320Sdim@@ -58,3 +58,15 @@ SparcELFMCAsmInfo::getExprForPersonalitySymbol(con 29263320Sdim 30263320Sdim return MCAsmInfo::getExprForPersonalitySymbol(Sym, Encoding, Streamer); 31263320Sdim } 32263320Sdim+ 33263320Sdim+const MCExpr* 34263320Sdim+SparcELFMCAsmInfo::getExprForFDESymbol(const MCSymbol *Sym, 35263320Sdim+ unsigned Encoding, 36263320Sdim+ MCStreamer &Streamer) const { 37263320Sdim+ if (Encoding & dwarf::DW_EH_PE_pcrel) { 38263320Sdim+ MCContext &Ctx = Streamer.getContext(); 39263320Sdim+ return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32, 40263320Sdim+ MCSymbolRefExpr::Create(Sym, Ctx), Ctx); 41263320Sdim+ } 42263320Sdim+ return MCAsmInfo::getExprForFDESymbol(Sym, Encoding, Streamer); 43263320Sdim+} 44263320SdimIndex: test/CodeGen/SPARC/exception.ll 45263320Sdim=================================================================== 46263320Sdim--- test/CodeGen/SPARC/exception.ll 47263320Sdim+++ test/CodeGen/SPARC/exception.ll 48263320Sdim@@ -57,6 +57,7 @@ 49263320Sdim ; V8PIC_NOCFI: .section .eh_frame 50263320Sdim ; V8PIC_NOCFI-NOT: .section 51263320Sdim ; V8PIC_NOCFI: .word %r_disp32(DW.ref.__gxx_personality_v0) 52263320Sdim+; V8PIC_NOCFI: .word %r_disp32(.Ltmp{{.+}}) ! FDE initial location 53263320Sdim 54263320Sdim 55263320Sdim ; V9ABS-LABEL: main: 56263320Sdim@@ -94,6 +95,7 @@ 57263320Sdim ; V9PIC_NOCFI: .section .eh_frame 58263320Sdim ; V9PIC_NOCFI-NOT: .section 59263320Sdim ; V9PIC_NOCFI: .word %r_disp32(DW.ref.__gxx_personality_v0) 60263320Sdim+; V9PIC_NOCFI: .word %r_disp32(.Ltmp{{.+}}) ! FDE initial location 61263320Sdim 62263320Sdim define i32 @main(i32 %argc, i8** nocapture readnone %argv) unnamed_addr #0 { 63263320Sdim entry: 64263320SdimIndex: include/llvm/MC/MCAsmInfo.h 65263320Sdim=================================================================== 66263320Sdim--- include/llvm/MC/MCAsmInfo.h 67263320Sdim+++ include/llvm/MC/MCAsmInfo.h 68263320Sdim@@ -371,7 +371,7 @@ namespace llvm { 69263320Sdim unsigned Encoding, 70263320Sdim MCStreamer &Streamer) const; 71263320Sdim 72263320Sdim- const MCExpr * 73263320Sdim+ virtual const MCExpr * 74263320Sdim getExprForFDESymbol(const MCSymbol *Sym, 75263320Sdim unsigned Encoding, 76263320Sdim MCStreamer &Streamer) const; 77