[X86][ELF] Correct relocation for DWARF TLS references
authorPaul Robinson <paul_robinson@playstation.sony.com>
Tue, 3 Mar 2015 21:01:27 +0000 (21:01 +0000)
committerPaul Robinson <paul_robinson@playstation.sony.com>
Tue, 3 Mar 2015 21:01:27 +0000 (21:01 +0000)
Previously we had only Linux using DTPOFF for these; all X86 ELF
targets should. Fixes a side issue mentioned in PR21077.

Differential Revision: http://reviews.llvm.org/D8011

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@231130 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86TargetMachine.cpp
lib/Target/X86/X86TargetObjectFile.cpp
lib/Target/X86/X86TargetObjectFile.h
test/DebugInfo/X86/tls.ll

index 4bde05306cef6e2e9638c19e38b0ec98ed9c92eb..aae0261f65b1cebbe476127bfad66157edf8cc4b 100644 (file)
@@ -40,7 +40,7 @@ static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
   if (TT.isOSLinux())
     return make_unique<X86LinuxTargetObjectFile>();
   if (TT.isOSBinFormatELF())
-    return make_unique<TargetLoweringObjectFileELF>();
+    return make_unique<X86ELFTargetObjectFile>();
   if (TT.isKnownWindowsMSVCEnvironment())
     return make_unique<X86WindowsTargetObjectFile>();
   if (TT.isOSBinFormatCOFF())
index 1d1c32eb2cb8f76c4a18739205bc06a827cfaf0a..678630db966a50e5edb7ffb95fc83642c96e6ad1 100644 (file)
@@ -62,18 +62,17 @@ const MCExpr *X86_64MachoTargetObjectFile::getIndirectSymViaGOTPCRel(
   return MCBinaryExpr::CreateAdd(Res, Off, getContext());
 }
 
+const MCExpr *X86ELFTargetObjectFile::getDebugThreadLocalSymbol(
+    const MCSymbol *Sym) const {
+  return MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_DTPOFF, getContext());
+}
+
 void
 X86LinuxTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) {
   TargetLoweringObjectFileELF::Initialize(Ctx, TM);
   InitializeELF(TM.Options.UseInitArray);
 }
 
-const MCExpr *
-X86LinuxTargetObjectFile::getDebugThreadLocalSymbol(
-    const MCSymbol *Sym) const {
-  return MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_DTPOFF, getContext());
-}
-
 const MCExpr *X86WindowsTargetObjectFile::getExecutableRelativeSymbol(
     const ConstantExpr *CE, Mangler &Mang, const TargetMachine &TM) const {
   // We are looking for the difference of two symbols, need a subtraction
index f7455382098f4f207c975af59707bb216a3d2304..a92c122838e312a1131d533142455024d87da6e1 100644 (file)
@@ -38,13 +38,17 @@ namespace llvm {
                                 int64_t Offset) const override;
   };
 
+  /// \brief This implemenatation is used for X86 ELF targets that don't
+  /// have a further specialization.
+  class X86ELFTargetObjectFile : public TargetLoweringObjectFileELF {
+    /// \brief Describe a TLS variable address within debug info.
+    const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const override;
+  };
+
   /// X86LinuxTargetObjectFile - This implementation is used for linux x86
   /// and x86-64.
-  class X86LinuxTargetObjectFile : public TargetLoweringObjectFileELF {
+  class X86LinuxTargetObjectFile : public X86ELFTargetObjectFile {
     void Initialize(MCContext &Ctx, const TargetMachine &TM) override;
-
-    /// \brief Describe a TLS variable address within debug info.
-    const MCExpr *getDebugThreadLocalSymbol(const MCSymbol *Sym) const override;
   };
 
   /// \brief This implementation is used for Windows targets on x86 and x86-64.
index 9054071874865abb028194922afe8d4d23f85dd6..3f334bad42c60cbcaf4ba46ae34d7c1132755c99 100644 (file)
@@ -7,6 +7,12 @@
 ; RUN: llc %s -o - -filetype=asm -O0 -mtriple=x86_64-unknown-linux-gnu -split-dwarf=Enable \
 ; RUN:   | FileCheck --check-prefix=CHECK --check-prefix=FISSION %s
 
+; RUN: llc %s -o - -filetype=asm -O0 -mtriple=x86_64-scei-ps4 \
+; RUN:   | FileCheck --check-prefix=CHECK --check-prefix=SINGLE --check-prefix=SINGLE-64 %s
+
+; RUN: llc %s -o - -filetype=asm -O0 -mtriple=x86_64-unknown-freebsd \
+; RUN:   | FileCheck --check-prefix=CHECK --check-prefix=SINGLE --check-prefix=SINGLE-64 %s
+
 ; FIXME: add relocation and DWARF expression support to llvm-dwarfdump & use
 ; that here instead of raw assembly printing