diff options
-rw-r--r-- | llvm/include/llvm/MC/MCAsmInfo.h | 2 | ||||
-rw-r--r-- | llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/SPARC/exception.ll | 2 |
4 files changed, 19 insertions, 1 deletions
diff --git a/llvm/include/llvm/MC/MCAsmInfo.h b/llvm/include/llvm/MC/MCAsmInfo.h index d3f48660ab0..c36d8585e36 100644 --- a/llvm/include/llvm/MC/MCAsmInfo.h +++ b/llvm/include/llvm/MC/MCAsmInfo.h @@ -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; diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp index 856b4bbf5d1..c5948680472 100644 --- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp +++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp @@ -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); +} diff --git a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h index 71dcf6bec35..d53d09deee4 100644 --- a/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h +++ b/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h @@ -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 diff --git a/llvm/test/CodeGen/SPARC/exception.ll b/llvm/test/CodeGen/SPARC/exception.ll index d6044e199f5..fd9e871dd9a 100644 --- a/llvm/test/CodeGen/SPARC/exception.ll +++ b/llvm/test/CodeGen/SPARC/exception.ll @@ -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: |