From 1f8fa31e5d549b1b4588cf5a1faacc37ab217dee Mon Sep 17 00:00:00 2001 From: Paul Robinson Date: Tue, 3 Mar 2015 21:01:27 +0000 Subject: [PATCH] [X86][ELF] Correct relocation for DWARF TLS references 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 | 2 +- lib/Target/X86/X86TargetObjectFile.cpp | 11 +++++------ lib/Target/X86/X86TargetObjectFile.h | 12 ++++++++---- test/DebugInfo/X86/tls.ll | 6 ++++++ 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index 4bde05306ce..aae0261f65b 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -40,7 +40,7 @@ static std::unique_ptr createTLOF(const Triple &TT) { if (TT.isOSLinux()) return make_unique(); if (TT.isOSBinFormatELF()) - return make_unique(); + return make_unique(); if (TT.isKnownWindowsMSVCEnvironment()) return make_unique(); if (TT.isOSBinFormatCOFF()) diff --git a/lib/Target/X86/X86TargetObjectFile.cpp b/lib/Target/X86/X86TargetObjectFile.cpp index 1d1c32eb2cb..678630db966 100644 --- a/lib/Target/X86/X86TargetObjectFile.cpp +++ b/lib/Target/X86/X86TargetObjectFile.cpp @@ -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 diff --git a/lib/Target/X86/X86TargetObjectFile.h b/lib/Target/X86/X86TargetObjectFile.h index f7455382098..a92c122838e 100644 --- a/lib/Target/X86/X86TargetObjectFile.h +++ b/lib/Target/X86/X86TargetObjectFile.h @@ -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. diff --git a/test/DebugInfo/X86/tls.ll b/test/DebugInfo/X86/tls.ll index 90540718748..3f334bad42c 100644 --- a/test/DebugInfo/X86/tls.ll +++ b/test/DebugInfo/X86/tls.ll @@ -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 -- 2.34.1