]> granicus.if.org Git - llvm/commitdiff
ARM: take care not to set the ThumbFunc bit on TLS data symbols
authorScott Douglass <sdouglass@arm.com>
Mon, 30 Jun 2014 09:37:24 +0000 (09:37 +0000)
committerScott Douglass <sdouglass@arm.com>
Mon, 30 Jun 2014 09:37:24 +0000 (09:37 +0000)
This fixes LNT SingleSource/UnitTests/Threads with -mthumb.

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

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

include/llvm/MC/MCELFSymbolFlags.h
lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
test/MC/ARM/thumb-types.s

index 2f1f5612212bc1ee9dd647c2a2a276f68cdbcdd5..297c44269a8f67a97120cd20a95ddf23fc56087a 100644 (file)
@@ -41,6 +41,7 @@ namespace llvm {
       ELF_STT_File      = (ELF::STT_FILE      << ELF_STT_Shift),
       ELF_STT_Common    = (ELF::STT_COMMON    << ELF_STT_Shift),
       ELF_STT_Tls       = (ELF::STT_TLS       << ELF_STT_Shift),
+      ELF_STT_GnuIFunc  = (ELF::STT_GNU_IFUNC << ELF_STT_Shift),
       ELF_STT_Loproc    = (ELF::STT_LOPROC    << ELF_STT_Shift),
       ELF_STT_Hiproc    = (ELF::STT_HIPROC    << ELF_STT_Shift),
 
index 3782a6b43ad326fb7156eb1709288f9d54d56fe6..7b5d8b01dfe6d6f5a54a23760e8384caaa1b4001 100644 (file)
@@ -992,7 +992,8 @@ void ARMTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
     return;
 
   const MCSymbolData &SD = Streamer.getOrCreateSymbolData(Symbol);
-  if (MCELF::GetType(SD) & (ELF::STT_FUNC << ELF_STT_Shift))
+  unsigned Type = MCELF::GetType(SD);
+  if (Type == ELF_STT_Func || Type == ELF_STT_GnuIFunc)
     Streamer.EmitThumbFunc(Symbol);
 }
 
index 2fd71525bab9e6c4e374ca41310489bb44986504..b3aaf7d80532cbe4a443caffae95be51bfeda09f 100644 (file)
@@ -29,6 +29,12 @@ untyped_text_label:
 explicit_function:
        nop
 
+       .long   tls(TPOFF)
+
+       .type indirect_function,%gnu_indirect_function
+indirect_function:
+       nop
+
        .data
 
 untyped_data_label:
@@ -38,6 +44,14 @@ untyped_data_label:
 explicit_data:
        .long 0
 
+       .section        .tdata,"awT",%progbits
+       .type   tls,%object
+       .align  2
+tls:
+       .long   42
+       .size   tls, 4
+
+
 @ CHECK: Symbol {
 @ CHECK:   Name: arm_function
 @ CHECK:   Value: 0x6
@@ -68,6 +82,18 @@ explicit_data:
 @ CHECK:   Type: Function
 @ CHECK: }
 
+@ CHECK: Symbol {
+@ CHECK:   Name: indirect_function
+@ CHECK:   Value: 0x13
+@ CHECK:   Type: GNU_IFunc
+@ CHECK: }
+
+@ CHECK: Symbol {
+@ CHECK:   Name: tls
+@ CHECK:   Value: 0x0
+@ CHECK:   Type: TLS
+@ CHECK: }
+
 @ CHECK: Symbol {
 @ CHECK:   Name: untyped_data_label
 @ CHECK:   Value: 0x0