summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorScott Douglass <sdouglass@arm.com>2014-06-30 09:37:24 +0000
committerScott Douglass <sdouglass@arm.com>2014-06-30 09:37:24 +0000
commit7650a9b8713e6f23495d558bb8c72e3f3c13a42b (patch)
tree30ff92a0fb98b8298d6f9863218cd97e0d3407ba /llvm
parent06812bc98b88d5769f3283a1d3085c1fd50d3908 (diff)
downloadbcm5719-llvm-7650a9b8713e6f23495d558bb8c72e3f3c13a42b.tar.gz
bcm5719-llvm-7650a9b8713e6f23495d558bb8c72e3f3c13a42b.zip
ARM: take care not to set the ThumbFunc bit on TLS data symbols
This fixes LNT SingleSource/UnitTests/Threads with -mthumb. Differential Revision: http://reviews.llvm.org/D4324 llvm-svn: 212029
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/MC/MCELFSymbolFlags.h1
-rw-r--r--llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp3
-rw-r--r--llvm/test/MC/ARM/thumb-types.s26
3 files changed, 29 insertions, 1 deletions
diff --git a/llvm/include/llvm/MC/MCELFSymbolFlags.h b/llvm/include/llvm/MC/MCELFSymbolFlags.h
index 2f1f5612212..297c44269a8 100644
--- a/llvm/include/llvm/MC/MCELFSymbolFlags.h
+++ b/llvm/include/llvm/MC/MCELFSymbolFlags.h
@@ -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),
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
index 3782a6b43ad..7b5d8b01dfe 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
@@ -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);
}
diff --git a/llvm/test/MC/ARM/thumb-types.s b/llvm/test/MC/ARM/thumb-types.s
index 2fd71525bab..b3aaf7d8053 100644
--- a/llvm/test/MC/ARM/thumb-types.s
+++ b/llvm/test/MC/ARM/thumb-types.s
@@ -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
@@ -69,6 +83,18 @@ explicit_data:
@ 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
@ CHECK: Type: None
OpenPOWER on IntegriCloud