From 99c3e481f3c1028b48764a7d30a48f8cda56c9ea Mon Sep 17 00:00:00 2001 From: Venkatraman Govindaraju Date: Wed, 29 Jan 2014 06:59:20 +0000 Subject: [Sparc] Use %r_disp32 for pc_rel entries in FDE as well. 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 | 2 +- lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp | 12 ++++++++++++ lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h | 4 ++++ test/CodeGen/SPARC/exception.ll | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/include/llvm/MC/MCAsmInfo.h b/include/llvm/MC/MCAsmInfo.h index d3f48660ab..c36d8585e3 100644 --- a/include/llvm/MC/MCAsmInfo.h +++ b/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/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp b/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp index 856b4bbf5d..c594868047 100644 --- a/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp +++ b/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/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h b/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h index 71dcf6bec3..d53d09deee 100644 --- a/lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h +++ b/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/test/CodeGen/SPARC/exception.ll b/test/CodeGen/SPARC/exception.ll index d6044e199f..fd9e871dd9 100644 --- a/test/CodeGen/SPARC/exception.ll +++ b/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: -- cgit v1.2.3