a1f8ad145e
applied to our copy of llvm/clang. These can be applied in alphabetical order to a pristine llvm/clang 3.4 release source tree, to result in the same version used in FreeBSD. This is intended to clearly document all the changes until now, which mostly consist of cherry pickings from the respective upstream trunks, plus a number of hand-written FreeBSD-specific ones. Hopefully those can eventually be cleaned up and sent upstream too. MFC after: 1 week X-MFC-With: r263313
297 lines
11 KiB
Diff
297 lines
11 KiB
Diff
Pull in r200373 from upstream llvm trunk (by Venkatraman Govindaraju):
|
|
|
|
[Sparc] Use %r_disp32 for pc_rel entries in gcc_except_table and eh_frame.
|
|
|
|
Otherwise, assembler (gas) fails to assemble them with error message "operation
|
|
combines symbols in different segments". This is because MC computes
|
|
pc_rel entries with subtract expression between labels from different sections.
|
|
|
|
Introduced here: http://svn.freebsd.org/changeset/base/262261
|
|
|
|
Index: lib/Target/Sparc/SparcTargetObjectFile.h
|
|
===================================================================
|
|
--- lib/Target/Sparc/SparcTargetObjectFile.h
|
|
+++ lib/Target/Sparc/SparcTargetObjectFile.h
|
|
@@ -0,0 +1,34 @@
|
|
+//===-- SparcTargetObjectFile.h - Sparc Object Info -------------*- C++ -*-===//
|
|
+//
|
|
+// The LLVM Compiler Infrastructure
|
|
+//
|
|
+// This file is distributed under the University of Illinois Open Source
|
|
+// License. See LICENSE.TXT for details.
|
|
+//
|
|
+//===----------------------------------------------------------------------===//
|
|
+
|
|
+#ifndef LLVM_TARGET_SPARC_TARGETOBJECTFILE_H
|
|
+#define LLVM_TARGET_SPARC_TARGETOBJECTFILE_H
|
|
+
|
|
+#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
|
|
+
|
|
+namespace llvm {
|
|
+
|
|
+class MCContext;
|
|
+class TargetMachine;
|
|
+
|
|
+class SparcELFTargetObjectFile : public TargetLoweringObjectFileELF {
|
|
+public:
|
|
+ SparcELFTargetObjectFile() :
|
|
+ TargetLoweringObjectFileELF()
|
|
+ {}
|
|
+
|
|
+ const MCExpr *
|
|
+ getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
|
+ MachineModuleInfo *MMI, unsigned Encoding,
|
|
+ MCStreamer &Streamer) const;
|
|
+};
|
|
+
|
|
+} // end namespace llvm
|
|
+
|
|
+#endif
|
|
Index: lib/Target/Sparc/SparcISelLowering.cpp
|
|
===================================================================
|
|
--- lib/Target/Sparc/SparcISelLowering.cpp
|
|
+++ lib/Target/Sparc/SparcISelLowering.cpp
|
|
@@ -16,6 +16,7 @@
|
|
#include "SparcMachineFunctionInfo.h"
|
|
#include "SparcRegisterInfo.h"
|
|
#include "SparcTargetMachine.h"
|
|
+#include "SparcTargetObjectFile.h"
|
|
#include "MCTargetDesc/SparcBaseInfo.h"
|
|
#include "llvm/CodeGen/CallingConvLower.h"
|
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
|
@@ -1361,7 +1362,7 @@ static SPCC::CondCodes FPCondCCodeToFCC(ISD::CondC
|
|
}
|
|
|
|
SparcTargetLowering::SparcTargetLowering(TargetMachine &TM)
|
|
- : TargetLowering(TM, new TargetLoweringObjectFileELF()) {
|
|
+ : TargetLowering(TM, new SparcELFTargetObjectFile()) {
|
|
Subtarget = &TM.getSubtarget<SparcSubtarget>();
|
|
|
|
// Set up the register classes.
|
|
Index: lib/Target/Sparc/SparcTargetObjectFile.cpp
|
|
===================================================================
|
|
--- lib/Target/Sparc/SparcTargetObjectFile.cpp
|
|
+++ lib/Target/Sparc/SparcTargetObjectFile.cpp
|
|
@@ -0,0 +1,48 @@
|
|
+//===------- SparcTargetObjectFile.cpp - Sparc Object Info Impl -----------===//
|
|
+//
|
|
+// The LLVM Compiler Infrastructure
|
|
+//
|
|
+// This file is distributed under the University of Illinois Open Source
|
|
+// License. See LICENSE.TXT for details.
|
|
+//
|
|
+//===----------------------------------------------------------------------===//
|
|
+
|
|
+#include "SparcTargetObjectFile.h"
|
|
+#include "MCTargetDesc/SparcMCExpr.h"
|
|
+#include "llvm/CodeGen/MachineModuleInfoImpls.h"
|
|
+#include "llvm/Support/Dwarf.h"
|
|
+#include "llvm/Target/Mangler.h"
|
|
+
|
|
+using namespace llvm;
|
|
+
|
|
+
|
|
+const MCExpr *SparcELFTargetObjectFile::
|
|
+getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
|
+ MachineModuleInfo *MMI, unsigned Encoding,
|
|
+ MCStreamer &Streamer) const {
|
|
+
|
|
+ if (Encoding & dwarf::DW_EH_PE_pcrel) {
|
|
+ MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
|
|
+
|
|
+ //MCSymbol *SSym = getSymbolWithGlobalValueBase(*Mang, GV, ".DW.stub");
|
|
+ SmallString<60> NameStr;
|
|
+ Mang->getNameWithPrefix(NameStr, GV, true);
|
|
+ NameStr.append(".DW.stub");
|
|
+ MCSymbol *SSym = getContext().GetOrCreateSymbol(NameStr.str());
|
|
+
|
|
+ // Add information about the stub reference to ELFMMI so that the stub
|
|
+ // gets emitted by the asmprinter.
|
|
+ MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
|
|
+ if (StubSym.getPointer() == 0) {
|
|
+ MCSymbol *Sym = getSymbol(*Mang, GV);
|
|
+ StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
|
|
+ }
|
|
+
|
|
+ MCContext &Ctx = getContext();
|
|
+ return SparcMCExpr::Create(SparcMCExpr::VK_Sparc_R_DISP32,
|
|
+ MCSymbolRefExpr::Create(SSym, Ctx), Ctx);
|
|
+ }
|
|
+
|
|
+ return TargetLoweringObjectFileELF::
|
|
+ getTTypeGlobalReference(GV, Mang, MMI, Encoding, Streamer);
|
|
+}
|
|
Index: lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp
|
|
===================================================================
|
|
--- lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp
|
|
+++ lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.cpp
|
|
@@ -12,7 +12,9 @@
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "SparcMCAsmInfo.h"
|
|
+#include "SparcMCExpr.h"
|
|
#include "llvm/ADT/Triple.h"
|
|
+#include "llvm/MC/MCStreamer.h"
|
|
|
|
using namespace llvm;
|
|
|
|
@@ -44,4 +46,15 @@ SparcELFMCAsmInfo::SparcELFMCAsmInfo(StringRef TT)
|
|
PrivateGlobalPrefix = ".L";
|
|
}
|
|
|
|
+const MCExpr*
|
|
+SparcELFMCAsmInfo::getExprForPersonalitySymbol(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::getExprForPersonalitySymbol(Sym, Encoding, Streamer);
|
|
+}
|
|
Index: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
|
|
===================================================================
|
|
--- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
|
|
+++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
|
|
@@ -41,6 +41,7 @@ void SparcMCExpr::PrintImpl(raw_ostream &OS) const
|
|
case VK_Sparc_L44: OS << "%l44("; break;
|
|
case VK_Sparc_HH: OS << "%hh("; break;
|
|
case VK_Sparc_HM: OS << "%hm("; break;
|
|
+ case VK_Sparc_R_DISP32: OS << "%r_disp32("; break;
|
|
case VK_Sparc_TLS_GD_HI22: OS << "%tgd_hi22("; break;
|
|
case VK_Sparc_TLS_GD_LO10: OS << "%tgd_lo10("; break;
|
|
case VK_Sparc_TLS_GD_ADD: OS << "%tgd_add("; break;
|
|
@@ -77,6 +78,7 @@ SparcMCExpr::VariantKind SparcMCExpr::parseVariant
|
|
.Case("l44", VK_Sparc_L44)
|
|
.Case("hh", VK_Sparc_HH)
|
|
.Case("hm", VK_Sparc_HM)
|
|
+ .Case("r_disp32", VK_Sparc_R_DISP32)
|
|
.Case("tgd_hi22", VK_Sparc_TLS_GD_HI22)
|
|
.Case("tgd_lo10", VK_Sparc_TLS_GD_LO10)
|
|
.Case("tgd_add", VK_Sparc_TLS_GD_ADD)
|
|
@@ -101,6 +103,8 @@ SparcMCExpr::VariantKind SparcMCExpr::parseVariant
|
|
bool
|
|
SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
|
|
const MCAsmLayout *Layout) const {
|
|
+ if (!Layout)
|
|
+ return false;
|
|
return getSubExpr()->EvaluateAsRelocatable(Res, *Layout);
|
|
}
|
|
|
|
Index: lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h
|
|
===================================================================
|
|
--- lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h
|
|
+++ lib/Target/Sparc/MCTargetDesc/SparcMCAsmInfo.h
|
|
@@ -17,13 +17,16 @@
|
|
#include "llvm/MC/MCAsmInfoELF.h"
|
|
|
|
namespace llvm {
|
|
- class StringRef;
|
|
+class StringRef;
|
|
|
|
- class SparcELFMCAsmInfo : public MCAsmInfoELF {
|
|
- virtual void anchor();
|
|
- public:
|
|
- explicit SparcELFMCAsmInfo(StringRef TT);
|
|
- };
|
|
+class SparcELFMCAsmInfo : public MCAsmInfoELF {
|
|
+ virtual void anchor();
|
|
+public:
|
|
+ explicit SparcELFMCAsmInfo(StringRef TT);
|
|
+ virtual const MCExpr* getExprForPersonalitySymbol(const MCSymbol *Sym,
|
|
+ unsigned Encoding,
|
|
+ MCStreamer &Streamer) const;
|
|
+};
|
|
|
|
} // namespace llvm
|
|
|
|
Index: lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
|
|
===================================================================
|
|
--- lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
|
|
+++ lib/Target/Sparc/MCTargetDesc/SparcMCExpr.h
|
|
@@ -31,6 +31,7 @@ class SparcMCExpr : public MCTargetExpr {
|
|
VK_Sparc_L44,
|
|
VK_Sparc_HH,
|
|
VK_Sparc_HM,
|
|
+ VK_Sparc_R_DISP32,
|
|
VK_Sparc_TLS_GD_HI22,
|
|
VK_Sparc_TLS_GD_LO10,
|
|
VK_Sparc_TLS_GD_ADD,
|
|
Index: lib/Target/Sparc/CMakeLists.txt
|
|
===================================================================
|
|
--- lib/Target/Sparc/CMakeLists.txt
|
|
+++ lib/Target/Sparc/CMakeLists.txt
|
|
@@ -27,6 +27,7 @@ add_llvm_target(SparcCodeGen
|
|
SparcJITInfo.cpp
|
|
SparcCodeEmitter.cpp
|
|
SparcMCInstLower.cpp
|
|
+ SparcTargetObjectFile.cpp
|
|
)
|
|
|
|
add_dependencies(LLVMSparcCodeGen SparcCommonTableGen intrinsics_gen)
|
|
Index: test/CodeGen/SPARC/exception.ll
|
|
===================================================================
|
|
--- test/CodeGen/SPARC/exception.ll
|
|
+++ test/CodeGen/SPARC/exception.ll
|
|
@@ -1,7 +1,9 @@
|
|
; RUN: llc < %s -march=sparc -relocation-model=static | FileCheck -check-prefix=V8ABS %s
|
|
; RUN: llc < %s -march=sparc -relocation-model=pic | FileCheck -check-prefix=V8PIC %s
|
|
+; RUN: llc < %s -march=sparc -relocation-model=pic -disable-cfi | FileCheck -check-prefix=V8PIC_NOCFI %s
|
|
; RUN: llc < %s -march=sparcv9 -relocation-model=static | FileCheck -check-prefix=V9ABS %s
|
|
; RUN: llc < %s -march=sparcv9 -relocation-model=pic | FileCheck -check-prefix=V9PIC %s
|
|
+; RUN: llc < %s -march=sparcv9 -relocation-model=pic -disable-cfi | FileCheck -check-prefix=V9PIC_NOCFI %s
|
|
|
|
|
|
%struct.__fundamental_type_info_pseudo = type { %struct.__type_info_pseudo }
|
|
@@ -40,11 +42,23 @@
|
|
; V8PIC: .cfi_register 15, 31
|
|
; V8PIC: .section .gcc_except_table
|
|
; V8PIC-NOT: .section
|
|
-; V8PIC: .word .L_ZTIi.DW.stub-
|
|
+; V8PIC: .word %r_disp32(.L_ZTIi.DW.stub)
|
|
; V8PIC: .data
|
|
; V8PIC: .L_ZTIi.DW.stub:
|
|
; V8PIC-NEXT: .word _ZTIi
|
|
|
|
+; V8PIC_NOCFI-LABEL: main:
|
|
+; V8PIC_NOCFI: .section .gcc_except_table
|
|
+; V8PIC_NOCFI-NOT: .section
|
|
+; V8PIC_NOCFI: .word %r_disp32(.L_ZTIi.DW.stub)
|
|
+; V8PIC_NOCFI: .data
|
|
+; V8PIC_NOCFI: .L_ZTIi.DW.stub:
|
|
+; V8PIC_NOCFI-NEXT: .word _ZTIi
|
|
+; V8PIC_NOCFI: .section .eh_frame
|
|
+; V8PIC_NOCFI-NOT: .section
|
|
+; V8PIC_NOCFI: .word %r_disp32(DW.ref.__gxx_personality_v0)
|
|
+
|
|
+
|
|
; V9ABS-LABEL: main:
|
|
; V9ABS: .cfi_startproc
|
|
; V9ABS: .cfi_personality 0, __gxx_personality_v0
|
|
@@ -65,11 +79,22 @@
|
|
; V9PIC: .cfi_register 15, 31
|
|
; V9PIC: .section .gcc_except_table
|
|
; V9PIC-NOT: .section
|
|
-; V9PIC: .word .L_ZTIi.DW.stub-
|
|
+; V9PIC: .word %r_disp32(.L_ZTIi.DW.stub)
|
|
; V9PIC: .data
|
|
; V9PIC: .L_ZTIi.DW.stub:
|
|
; V9PIC-NEXT: .xword _ZTIi
|
|
|
|
+; V9PIC_NOCFI-LABEL: main:
|
|
+; V9PIC_NOCFI: .section .gcc_except_table
|
|
+; V9PIC_NOCFI-NOT: .section
|
|
+; V9PIC_NOCFI: .word %r_disp32(.L_ZTIi.DW.stub)
|
|
+; V9PIC_NOCFI: .data
|
|
+; V9PIC_NOCFI: .L_ZTIi.DW.stub:
|
|
+; V9PIC_NOCFI-NEXT: .xword _ZTIi
|
|
+; V9PIC_NOCFI: .section .eh_frame
|
|
+; V9PIC_NOCFI-NOT: .section
|
|
+; V9PIC_NOCFI: .word %r_disp32(DW.ref.__gxx_personality_v0)
|
|
+
|
|
define i32 @main(i32 %argc, i8** nocapture readnone %argv) unnamed_addr #0 {
|
|
entry:
|
|
%0 = icmp eq i32 %argc, 2
|