patch-r262261-llvm-r200373-sparc.diff revision 269012
11573SrgrimesPull in r200373 from upstream llvm trunk (by Venkatraman Govindaraju): 21573Srgrimes 31573Srgrimes [Sparc] Use %r_disp32 for pc_rel entries in gcc_except_table and eh_frame. 41573Srgrimes 51573Srgrimes Otherwise, assembler (gas) fails to assemble them with error message "operation 61573Srgrimes combines symbols in different segments". This is because MC computes 71573Srgrimes pc_rel entries with subtract expression between labels from different sections. 81573Srgrimes 91573SrgrimesIntroduced here: http://svnweb.freebsd.org/changeset/base/262261 101573Srgrimes 111573SrgrimesIndex: lib/Target/Sparc/SparcTargetObjectFile.h 121573Srgrimes=================================================================== 131573Srgrimes--- lib/Target/Sparc/SparcTargetObjectFile.h 141573Srgrimes+++ lib/Target/Sparc/SparcTargetObjectFile.h 151573Srgrimes@@ -0,0 +1,34 @@ 161573Srgrimes+//===-- SparcTargetObjectFile.h - Sparc Object Info -------------*- C++ -*-===// 171573Srgrimes+// 181573Srgrimes+// The LLVM Compiler Infrastructure 191573Srgrimes+// 201573Srgrimes+// This file is distributed under the University of Illinois Open Source 211573Srgrimes+// License. See LICENSE.TXT for details. 221573Srgrimes+// 231573Srgrimes+//===----------------------------------------------------------------------===// 241573Srgrimes+ 251573Srgrimes+#ifndef LLVM_TARGET_SPARC_TARGETOBJECTFILE_H 261573Srgrimes+#define LLVM_TARGET_SPARC_TARGETOBJECTFILE_H 271573Srgrimes+ 281573Srgrimes+#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 291573Srgrimes+ 301573Srgrimes+namespace llvm { 311573Srgrimes+ 321573Srgrimes+class MCContext; 3390041Sobrien+class TargetMachine; 3490041Sobrien+ 351573Srgrimes+class SparcELFTargetObjectFile : public TargetLoweringObjectFileELF { 3671579Sdeischen+public: 371573Srgrimes+ SparcELFTargetObjectFile() : 381573Srgrimes+ TargetLoweringObjectFileELF() 3930399Sbde+ {} 401573Srgrimes+ 411573Srgrimes+ const MCExpr * 421573Srgrimes+ getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang, 431573Srgrimes+ MachineModuleInfo *MMI, unsigned Encoding, 441573Srgrimes+ MCStreamer &Streamer) const; 451573Srgrimes+}; 461573Srgrimes+ 471573Srgrimes+} // end namespace llvm 4871579Sdeischen+ 49179947Sed+#endif 501573SrgrimesIndex: lib/Target/Sparc/SparcISelLowering.cpp 511573Srgrimes=================================================================== 521573Srgrimes--- lib/Target/Sparc/SparcISelLowering.cpp 531573Srgrimes+++ lib/Target/Sparc/SparcISelLowering.cpp 541573Srgrimes@@ -16,6 +16,7 @@ 551573Srgrimes #include "SparcMachineFunctionInfo.h" 561573Srgrimes #include "SparcRegisterInfo.h" 57200136Sed #include "SparcTargetMachine.h" 5840356Sdes+#include "SparcTargetObjectFile.h" 591573Srgrimes #include "MCTargetDesc/SparcBaseInfo.h" 601573Srgrimes #include "llvm/CodeGen/CallingConvLower.h" 6140357Sdes #include "llvm/CodeGen/MachineFrameInfo.h" 6240356Sdes@@ -1361,7 +1362,7 @@ static SPCC::CondCodes FPCondCCodeToFCC(ISD::CondC 6340396Sdes } 641573Srgrimes 6540396Sdes SparcTargetLowering::SparcTargetLowering(TargetMachine &TM) 6644974Speter- : TargetLowering(TM, new TargetLoweringObjectFileELF()) { 6744974Speter+ : TargetLowering(TM, new SparcELFTargetObjectFile()) { 6840356Sdes Subtarget = &TM.getSubtarget<SparcSubtarget>(); 6944974Speter 7040356Sdes // Set up the register classes. 7140357SdesIndex: lib/Target/Sparc/SparcTargetObjectFile.cpp 72200136Sed=================================================================== 7340356Sdes--- lib/Target/Sparc/SparcTargetObjectFile.cpp 7440356Sdes+++ lib/Target/Sparc/SparcTargetObjectFile.cpp 7540356Sdes@@ -0,0 +1,48 @@ 76200136Sed+//===------- SparcTargetObjectFile.cpp - Sparc Object Info Impl -----------===// 771573Srgrimes+// 781573Srgrimes+// The LLVM Compiler Infrastructure 791573Srgrimes+// 801573Srgrimes+// This file is distributed under the University of Illinois Open Source 811573Srgrimes+// License. See LICENSE.TXT for details. 821573Srgrimes+// 83200136Sed+//===----------------------------------------------------------------------===// 84200136Sed+ 8540396Sdes+#include "SparcTargetObjectFile.h" 861573Srgrimes+#include "MCTargetDesc/SparcMCExpr.h" 871573Srgrimes+#include "llvm/CodeGen/MachineModuleInfoImpls.h" 8840396Sdes+#include "llvm/Support/Dwarf.h" 8940396Sdes+#include "llvm/Target/Mangler.h" 9040396Sdes+ 911573Srgrimes+using namespace llvm; 9240396Sdes+ 9344974Speter+ 9444974Speter+const MCExpr *SparcELFTargetObjectFile:: 9540396Sdes+getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang, 9644974Speter+ MachineModuleInfo *MMI, unsigned Encoding, 9740396Sdes+ MCStreamer &Streamer) const { 9840396Sdes+ 99200136Sed+ if (Encoding & dwarf::DW_EH_PE_pcrel) { 10040396Sdes+ MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 10140396Sdes+ 10240396Sdes+ //MCSymbol *SSym = getSymbolWithGlobalValueBase(*Mang, GV, ".DW.stub"); 10340396Sdes+ SmallString<60> NameStr; 104200136Sed+ Mang->getNameWithPrefix(NameStr, GV, true); 1051573Srgrimes+ NameStr.append(".DW.stub"); 1061573Srgrimes+ MCSymbol *SSym = getContext().GetOrCreateSymbol(NameStr.str()); 1071573Srgrimes+ 1081573Srgrimes+ // Add information about the stub reference to ELFMMI so that the stub 1091573Srgrimes+ // gets emitted by the asmprinter. 1101573Srgrimes+ MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym); 111200136Sed+ if (StubSym.getPointer() == 0) { 11244974Speter+ MCSymbol *Sym = getSymbol(*Mang, GV); 1131573Srgrimes+ StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 1141573Srgrimes+ } 11544974Speter+ 11644974Speter+ MCContext &Ctx = getContext(); 11744974Speter+ return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32, 1181573Srgrimes+ MCSymbolRefExpr::Create(SSym, Ctx), Ctx); 11944974Speter+ } 12044974Speter+ 12144974Speter+ return TargetLoweringObjectFileELF:: 12244974Speter+ getTTypeGlobalReference(GV, Mang, MMI, Encoding, Streamer); 12344974Speter+} 12444974SpeterIndex: lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp 12544974Speter=================================================================== 126200136Sed--- lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp 12744974Speter+++ lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp 12844974Speter@@ -12,7 +12,9 @@ 12944974Speter //===----------------------------------------------------------------------===// 130200136Sed 1311573Srgrimes #include "SparcMCAsmInfo.h" 1321573Srgrimes+#include "SparcMCExpr.h" 1331573Srgrimes #include "llvm/ADT/Triple.h" 1341573Srgrimes+#include "llvm/MC/MCStreamer.h" 1351573Srgrimes 1361573Srgrimes using namespace llvm; 1371573Srgrimes 13871579Sdeischen@@ -44,4 +46,15 @@ SparcELFMCAsmInfo::SparcELFMCAsmInfo(StringRef TT) 1391573Srgrimes PrivateGlobalPrefix = ".L"; 1401573Srgrimes } 1411573Srgrimes 1421573Srgrimes+const MCExpr* 143117111Sbde+SparcELFMCAsmInfo::getExprForPersonalitySymbol(const MCSymbol *Sym, 144117030Sgordon+ unsigned Encoding, 145179947Sed+ MCStreamer &Streamer) const { 146117030Sgordon+ if (Encoding & dwarf::DW_EH_PE_pcrel) { 147117030Sgordon+ MCContext &Ctx = Streamer.getContext(); 148179838Sdavidxu+ return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32, 149200136Sed+ MCSymbolRefExpr::Create(Sym, Ctx), Ctx); 150200136Sed+ } 1511573Srgrimes 152200136Sed+ return MCAsmInfo::getExprForPersonalitySymbol(Sym, Encoding, Streamer); 153200136Sed+} 15430399SbdeIndex: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp 155200136Sed=================================================================== 156200136Sed--- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp 15730399Sbde+++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp 1581573Srgrimes@@ -41,6 +41,7 @@ void SparcMCExpr::PrintImpl(raw_ostream &OS) const 15930399Sbde case VK_Sparc_L44: OS << "%l44("; break; 16019850Sbde case VK_Sparc_HH: OS << "%hh("; break; 1611573Srgrimes case VK_Sparc_HM: OS << "%hm("; break; 162229403Sed+ case VK_Sparc_R_DISP32: OS << "%r_disp32("; break; 163200136Sed case VK_Sparc_TLS_GD_HI22: OS << "%tgd_hi22("; break; 164117030Sgordon case VK_Sparc_TLS_GD_LO10: OS << "%tgd_lo10("; break; 1651573Srgrimes case VK_Sparc_TLS_GD_ADD: OS << "%tgd_add("; break; 1661573Srgrimes@@ -77,6 +78,7 @@ SparcMCExpr::VariantKind SparcMCExpr::parseVariant 1671573Srgrimes .Case("l44", VK_Sparc_L44) 1681573Srgrimes .Case("hh", VK_Sparc_HH) 16919852Sbde .Case("hm", VK_Sparc_HM) 17019852Sbde+ .Case("r_disp32", VK_Sparc_R_DISP32) 17119852Sbde .Case("tgd_hi22", VK_Sparc_TLS_GD_HI22) 17219852Sbde .Case("tgd_lo10", VK_Sparc_TLS_GD_LO10) 17319852Sbde .Case("tgd_add", VK_Sparc_TLS_GD_ADD) 17419852Sbde@@ -101,6 +103,8 @@ SparcMCExpr::VariantKind SparcMCExpr::parseVariant 17544974Speter bool 17644974Speter SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, 17744974Speter const MCAsmLayout *Layout) const { 17844974Speter+ if (!Layout) 17944974Speter+ return false; 18044974Speter return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); 181117111Sbde } 1821573Srgrimes 1831573SrgrimesIndex: lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h 1841573Srgrimes=================================================================== 1851573Srgrimes--- lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h 186117111Sbde+++ lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h 1871573Srgrimes@@ -17,13 +17,16 @@ 1881573Srgrimes #include "llvm/MC/MCAsmInfoELF.h" 1891573Srgrimes 1901573Srgrimes namespace llvm { 1911573Srgrimes- class StringRef; 1921573Srgrimes+class StringRef; 1931573Srgrimes 1941573Srgrimes- class SparcELFMCAsmInfo : public MCAsmInfoELF { 1951573Srgrimes- virtual void anchor(); 1961573Srgrimes- public: 1971573Srgrimes- explicit SparcELFMCAsmInfo(StringRef TT); 1981573Srgrimes- }; 199117030Sgordon+class SparcELFMCAsmInfo : public MCAsmInfoELF { 20056698Sjasone+ virtual void anchor(); 20156698Sjasone+public: 20255837Sjasone+ explicit SparcELFMCAsmInfo(StringRef TT); 2031573Srgrimes+ virtual const MCExpr* getExprForPersonalitySymbol(const MCSymbol *Sym, 2041573Srgrimes+ unsigned Encoding, 2051573Srgrimes+ MCStreamer &Streamer) const; 2061573Srgrimes+}; 2071573Srgrimes 2081573Srgrimes } // namespace llvm 2091573Srgrimes 210199862SedIndex: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h 211117111Sbde=================================================================== 21230399Sbde--- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h 21330399Sbde+++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h 21430399Sbde@@ -31,6 +31,7 @@ class SparcMCExpr : public MCTargetExpr { 21530399Sbde VK_Sparc_L44, 2161573Srgrimes VK_Sparc_HH, 2171573Srgrimes VK_Sparc_HM, 2181573Srgrimes+ VK_Sparc_R_DISP32, 2195070Sbde VK_Sparc_TLS_GD_HI22, 2205070Sbde VK_Sparc_TLS_GD_LO10, 22144984Speter VK_Sparc_TLS_GD_ADD, 22244974SpeterIndex: lib/Target/Sparc/CMakeLists.txt 22344974Speter=================================================================== 2245070Sbde--- lib/Target/Sparc/CMakeLists.txt 22544974Speter+++ lib/Target/Sparc/CMakeLists.txt 2261573Srgrimes@@ -27,6 +27,7 @@ add_llvm_target(SparcCodeGen 2271573Srgrimes SparcJITInfo.cpp 2281573Srgrimes SparcCodeEmitter.cpp 229200136Sed SparcMCInstLower.cpp 230200136Sed+ SparcTargetObjectFile.cpp 2311573Srgrimes ) 23230399Sbde 23330399Sbde add_dependencies(LLVMSparcCodeGen SparcCommonTableGen intrinsics_gen) 23430399SbdeIndex: test/CodeGen/SPARC/exception.ll 23530399Sbde=================================================================== 2361573Srgrimes--- test/CodeGen/SPARC/exception.ll 23730399Sbde+++ test/CodeGen/SPARC/exception.ll 23830399Sbde@@ -1,7 +1,9 @@ 23930399Sbde ; RUN: llc < %s -march=sparc -relocation-model=static | FileCheck -check-prefix=V8ABS %s 24030399Sbde ; RUN: llc < %s -march=sparc -relocation-model=pic | FileCheck -check-prefix=V8PIC %s 2411573Srgrimes+; RUN: llc < %s -march=sparc -relocation-model=pic -disable-cfi | FileCheck -check-prefix=V8PIC_NOCFI %s 24230399Sbde ; RUN: llc < %s -march=sparcv9 -relocation-model=static | FileCheck -check-prefix=V9ABS %s 24330399Sbde ; RUN: llc < %s -march=sparcv9 -relocation-model=pic | FileCheck -check-prefix=V9PIC %s 24430399Sbde+; RUN: llc < %s -march=sparcv9 -relocation-model=pic -disable-cfi | FileCheck -check-prefix=V9PIC_NOCFI %s 24530399Sbde 24630399Sbde 24730399Sbde %struct.__fundamental_type_info_pseudo = type { %struct.__type_info_pseudo } 24830399Sbde@@ -40,11 +42,23 @@ 24930399Sbde ; V8PIC: .cfi_register 15, 31 25031309Sbde ; V8PIC: .section .gcc_except_table 25130399Sbde ; V8PIC-NOT: .section 25230399Sbde-; V8PIC: .word .L_ZTIi.DW.stub- 25330399Sbde+; V8PIC: .word %r_disp32(.L_ZTIi.DW.stub) 25430399Sbde ; V8PIC: .data 25530399Sbde ; V8PIC: .L_ZTIi.DW.stub: 25630399Sbde ; V8PIC-NEXT: .word _ZTIi 2571573Srgrimes 2581573Srgrimes+; V8PIC_NOCFI-LABEL: main: 2591573Srgrimes+; V8PIC_NOCFI: .section .gcc_except_table 2601573Srgrimes+; V8PIC_NOCFI-NOT: .section 2611573Srgrimes+; V8PIC_NOCFI: .word %r_disp32(.L_ZTIi.DW.stub) 26230399Sbde+; V8PIC_NOCFI: .data 2631573Srgrimes+; V8PIC_NOCFI: .L_ZTIi.DW.stub: 26444974Speter+; V8PIC_NOCFI-NEXT: .word _ZTIi 2651573Srgrimes+; V8PIC_NOCFI: .section .eh_frame 2661573Srgrimes+; V8PIC_NOCFI-NOT: .section 267179838Sdavidxu+; V8PIC_NOCFI: .word %r_disp32(DW.ref.__gxx_personality_v0) 268179838Sdavidxu+ 269179838Sdavidxu+ 270179838Sdavidxu ; V9ABS-LABEL: main: 271179838Sdavidxu ; V9ABS: .cfi_startproc 272179838Sdavidxu ; V9ABS: .cfi_personality 0, __gxx_personality_v0 273179838Sdavidxu@@ -65,11 +79,22 @@ 274179838Sdavidxu ; V9PIC: .cfi_register 15, 31 275179947Sed ; V9PIC: .section .gcc_except_table 276179838Sdavidxu ; V9PIC-NOT: .section 277179838Sdavidxu-; V9PIC: .word .L_ZTIi.DW.stub- 278179838Sdavidxu+; V9PIC: .word %r_disp32(.L_ZTIi.DW.stub) 279179838Sdavidxu ; V9PIC: .data 280179838Sdavidxu ; V9PIC: .L_ZTIi.DW.stub: 281179838Sdavidxu ; V9PIC-NEXT: .xword _ZTIi 282179838Sdavidxu 283179838Sdavidxu+; V9PIC_NOCFI-LABEL: main: 284179838Sdavidxu+; V9PIC_NOCFI: .section .gcc_except_table 285+; V9PIC_NOCFI-NOT: .section 286+; V9PIC_NOCFI: .word %r_disp32(.L_ZTIi.DW.stub) 287+; V9PIC_NOCFI: .data 288+; V9PIC_NOCFI: .L_ZTIi.DW.stub: 289+; V9PIC_NOCFI-NEXT: .xword _ZTIi 290+; V9PIC_NOCFI: .section .eh_frame 291+; V9PIC_NOCFI-NOT: .section 292+; V9PIC_NOCFI: .word %r_disp32(DW.ref.__gxx_personality_v0) 293+ 294 define i32 @main(i32 %argc, i8** nocapture readnone %argv) unnamed_addr #0 { 295 entry: 296 %0 = icmp eq i32 %argc, 2 297