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