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