Skip to content

Commit

Permalink
[TargetMachine] Don't imply dso_local on function declarations in Rel…
Browse files Browse the repository at this point in the history
…oc::Static model for ELF/wasm

clang/lib/CodeGen/CodeGenModule sets dso_local on applicable function declarations,
we don't need to duplicate the work in TargetMachine:shouldAssumeDSOLocal.
(Actually the long-term goal (started by r324535) is to drop TargetMachine::shouldAssumeDSOLocal.)

By not implying dso_local, we will respect dso_local/dso_preemptable specifiers
set by the frontend. This allows the proposed -fno-direct-access-external-data
option to work with -fno-pic and prevent a canonical PLT entry (SHN_UNDEF with non-zero st_value)
when taking the address of a function symbol.

This patch should be NFC in terms of the Clang emitted assembly because the case
we don't set dso_local is a case Clang sets dso_local. However, some tests don't
set dso_local on some function declarations and expose some differences. Most
tests have been fixed to be more robust in the previous commit.
  • Loading branch information
MaskRay committed Dec 5, 2020
1 parent 6b6c3aa commit a084c03
Show file tree
Hide file tree
Showing 19 changed files with 111 additions and 111 deletions.
13 changes: 4 additions & 9 deletions llvm/lib/Target/TargetMachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,9 @@ bool TargetMachine::shouldAssumeDSOLocal(const Module &M,
// dso_preemptable. At this point in time, the various IR producers
// have not been transitioned to always produce a dso_local when it
// is possible to do so.
// In the case of ExternalSymbolSDNode, GV is null and there is nowhere to put
// dso_local. Returning false for those will produce worse code in some
// architectures. For example, on x86 the caller has to set ebx before calling
// a plt.
// In the case of ExternalSymbolSDNode, GV is null and we should just return
// false. However, COFF currently relies on this to be true
//
// As a result we still have some logic in here to improve the quality of the
// generated code.
// FIXME: Add a module level metadata for whether intrinsics should be assumed
Expand Down Expand Up @@ -191,12 +190,8 @@ bool TargetMachine::shouldAssumeDSOLocal(const Module &M,
// drop the if block entirely and respect dso_local/dso_preemptable
// specifiers set by the frontend.
if (RM == Reloc::Static) {
// We currently respect dso_local/dso_preemptable specifiers for
// variables.
if (F)
return true;
// TODO Remove the special case for x86-32.
if (Arch == Triple::x86 && !GV->isThreadLocal())
if (Arch == Triple::x86 && !F && !GV->isThreadLocal())
return true;
}
} else if (TT.isOSBinFormatELF()) {
Expand Down
4 changes: 4 additions & 0 deletions llvm/lib/Target/X86/X86Subtarget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,10 @@ unsigned char X86Subtarget::classifyGlobalReference(const GlobalValue *GV,
return X86II::MO_DARWIN_NONLAZY_PIC_BASE;
}

// 32-bit ELF references GlobalAddress directly in static relocation model.
// We cannot use MO_GOT because EBX may not be set up.
if (TM.getRelocationModel() == Reloc::Static)
return X86II::MO_NO_FLAG;
return X86II::MO_GOT;
}

Expand Down
4 changes: 2 additions & 2 deletions llvm/test/CodeGen/AArch64/tiny_model.ll
Original file line number Diff line number Diff line change
Expand Up @@ -370,12 +370,12 @@ declare void @func(...)
define i8* @externfuncaddr() {
; CHECK-LABEL: externfuncaddr:
; CHECK: // %bb.0: // %entry
; CHECK-NEXT: adr x0, func
; CHECK-NEXT: ldr x0, :got:func
; CHECK-NEXT: ret
;
; CHECK-GLOBISEL-LABEL: externfuncaddr:
; CHECK-GLOBISEL: // %bb.0: // %entry
; CHECK-GLOBISEL-NEXT: adr x0, func
; CHECK-GLOBISEL-NEXT: ldr x0, :got:func
; CHECK-GLOBISEL-NEXT: ret
;
; CHECK-PIC-LABEL: externfuncaddr:
Expand Down
5 changes: 3 additions & 2 deletions llvm/test/CodeGen/ARM/fast-isel-call.ll
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,9 @@ entry:
; ARM-LONG-MACHO: {{(movt [[R1]], :upper16:L_bar\$non_lazy_ptr)?}}
; ARM-LONG-MACHO: ldr [[R:r[0-9]+]], {{\[}}[[R1]]]

; ARM-LONG-ELF: movw [[R:l?r[0-9]*]], :lower16:bar
; ARM-LONG-ELF: {{(movt [[R]], :upper16:L_bar\$non_lazy_ptr)?}}
; ARM-LONG-ELF: movw [[R1:r[0-9]*]], :lower16:bar
; ARM-LONG-ELF: movt [[R1]], :upper16:bar
; ARM-LONG-ELF: ldr [[R:r[0-9]+]], {{\[}}[[R1]]]

; ARM-LONG: blx [[R]]
; THUMB: @t10
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/RISCV/mir-target-flags.ll
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ define i32 @caller(i32 %a) nounwind {
; RV32-SMALL: target-flags(riscv-tprel-hi) @t_le
; RV32-SMALL-NEXT: target-flags(riscv-tprel-add) @t_le
; RV32-SMALL-NEXT: target-flags(riscv-tprel-lo) @t_le
; RV32-SMALL: target-flags(riscv-call) @callee
; RV32-SMALL: target-flags(riscv-plt) @callee
;
; RV32-MED-LABEL: name: caller
; RV32-MED: target-flags(riscv-got-hi) @g_e
Expand Down
70 changes: 35 additions & 35 deletions llvm/test/CodeGen/X86/abi-isel.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10676,26 +10676,26 @@ define void @lcallee() nounwind {
; LINUX-64-STATIC-LABEL: lcallee:
; LINUX-64-STATIC: # %bb.0: # %entry
; LINUX-64-STATIC-NEXT: pushq %rax
; LINUX-64-STATIC-NEXT: callq x
; LINUX-64-STATIC-NEXT: callq x
; LINUX-64-STATIC-NEXT: callq x
; LINUX-64-STATIC-NEXT: callq x
; LINUX-64-STATIC-NEXT: callq x
; LINUX-64-STATIC-NEXT: callq x
; LINUX-64-STATIC-NEXT: callq x
; LINUX-64-STATIC-NEXT: callq x@PLT
; LINUX-64-STATIC-NEXT: callq x@PLT
; LINUX-64-STATIC-NEXT: callq x@PLT
; LINUX-64-STATIC-NEXT: callq x@PLT
; LINUX-64-STATIC-NEXT: callq x@PLT
; LINUX-64-STATIC-NEXT: callq x@PLT
; LINUX-64-STATIC-NEXT: callq x@PLT
; LINUX-64-STATIC-NEXT: popq %rax
; LINUX-64-STATIC-NEXT: retq
;
; LINUX-32-STATIC-LABEL: lcallee:
; LINUX-32-STATIC: # %bb.0: # %entry
; LINUX-32-STATIC-NEXT: subl $12, %esp
; LINUX-32-STATIC-NEXT: calll x
; LINUX-32-STATIC-NEXT: calll x
; LINUX-32-STATIC-NEXT: calll x
; LINUX-32-STATIC-NEXT: calll x
; LINUX-32-STATIC-NEXT: calll x
; LINUX-32-STATIC-NEXT: calll x
; LINUX-32-STATIC-NEXT: calll x
; LINUX-32-STATIC-NEXT: calll x@PLT
; LINUX-32-STATIC-NEXT: calll x@PLT
; LINUX-32-STATIC-NEXT: calll x@PLT
; LINUX-32-STATIC-NEXT: calll x@PLT
; LINUX-32-STATIC-NEXT: calll x@PLT
; LINUX-32-STATIC-NEXT: calll x@PLT
; LINUX-32-STATIC-NEXT: calll x@PLT
; LINUX-32-STATIC-NEXT: addl $12, %esp
; LINUX-32-STATIC-NEXT: retl
;
Expand Down Expand Up @@ -10827,26 +10827,26 @@ define internal void @dcallee() nounwind {
; LINUX-64-STATIC-LABEL: dcallee:
; LINUX-64-STATIC: # %bb.0: # %entry
; LINUX-64-STATIC-NEXT: pushq %rax
; LINUX-64-STATIC-NEXT: callq y
; LINUX-64-STATIC-NEXT: callq y
; LINUX-64-STATIC-NEXT: callq y
; LINUX-64-STATIC-NEXT: callq y
; LINUX-64-STATIC-NEXT: callq y
; LINUX-64-STATIC-NEXT: callq y
; LINUX-64-STATIC-NEXT: callq y
; LINUX-64-STATIC-NEXT: callq y@PLT
; LINUX-64-STATIC-NEXT: callq y@PLT
; LINUX-64-STATIC-NEXT: callq y@PLT
; LINUX-64-STATIC-NEXT: callq y@PLT
; LINUX-64-STATIC-NEXT: callq y@PLT
; LINUX-64-STATIC-NEXT: callq y@PLT
; LINUX-64-STATIC-NEXT: callq y@PLT
; LINUX-64-STATIC-NEXT: popq %rax
; LINUX-64-STATIC-NEXT: retq
;
; LINUX-32-STATIC-LABEL: dcallee:
; LINUX-32-STATIC: # %bb.0: # %entry
; LINUX-32-STATIC-NEXT: subl $12, %esp
; LINUX-32-STATIC-NEXT: calll y
; LINUX-32-STATIC-NEXT: calll y
; LINUX-32-STATIC-NEXT: calll y
; LINUX-32-STATIC-NEXT: calll y
; LINUX-32-STATIC-NEXT: calll y
; LINUX-32-STATIC-NEXT: calll y
; LINUX-32-STATIC-NEXT: calll y
; LINUX-32-STATIC-NEXT: calll y@PLT
; LINUX-32-STATIC-NEXT: calll y@PLT
; LINUX-32-STATIC-NEXT: calll y@PLT
; LINUX-32-STATIC-NEXT: calll y@PLT
; LINUX-32-STATIC-NEXT: calll y@PLT
; LINUX-32-STATIC-NEXT: calll y@PLT
; LINUX-32-STATIC-NEXT: calll y@PLT
; LINUX-32-STATIC-NEXT: addl $12, %esp
; LINUX-32-STATIC-NEXT: retl
;
Expand Down Expand Up @@ -10977,7 +10977,7 @@ declare void @y()
define void ()* @address() nounwind {
; LINUX-64-STATIC-LABEL: address:
; LINUX-64-STATIC: # %bb.0: # %entry
; LINUX-64-STATIC-NEXT: movl $callee, %eax
; LINUX-64-STATIC-NEXT: movq callee@{{.*}}(%rip), %rax
; LINUX-64-STATIC-NEXT: retq
;
; LINUX-32-STATIC-LABEL: address:
Expand Down Expand Up @@ -11169,16 +11169,16 @@ define void @caller() nounwind {
; LINUX-64-STATIC-LABEL: caller:
; LINUX-64-STATIC: # %bb.0: # %entry
; LINUX-64-STATIC-NEXT: pushq %rax
; LINUX-64-STATIC-NEXT: callq callee
; LINUX-64-STATIC-NEXT: callq callee
; LINUX-64-STATIC-NEXT: callq callee@PLT
; LINUX-64-STATIC-NEXT: callq callee@PLT
; LINUX-64-STATIC-NEXT: popq %rax
; LINUX-64-STATIC-NEXT: retq
;
; LINUX-32-STATIC-LABEL: caller:
; LINUX-32-STATIC: # %bb.0: # %entry
; LINUX-32-STATIC-NEXT: subl $12, %esp
; LINUX-32-STATIC-NEXT: calll callee
; LINUX-32-STATIC-NEXT: calll callee
; LINUX-32-STATIC-NEXT: calll callee@PLT
; LINUX-32-STATIC-NEXT: calll callee@PLT
; LINUX-32-STATIC-NEXT: addl $12, %esp
; LINUX-32-STATIC-NEXT: retl
;
Expand Down Expand Up @@ -11451,14 +11451,14 @@ define void @tailcaller() nounwind {
; LINUX-64-STATIC-LABEL: tailcaller:
; LINUX-64-STATIC: # %bb.0: # %entry
; LINUX-64-STATIC-NEXT: pushq %rax
; LINUX-64-STATIC-NEXT: callq callee
; LINUX-64-STATIC-NEXT: callq callee@PLT
; LINUX-64-STATIC-NEXT: popq %rax
; LINUX-64-STATIC-NEXT: retq
;
; LINUX-32-STATIC-LABEL: tailcaller:
; LINUX-32-STATIC: # %bb.0: # %entry
; LINUX-32-STATIC-NEXT: subl $12, %esp
; LINUX-32-STATIC-NEXT: calll callee
; LINUX-32-STATIC-NEXT: calll callee@PLT
; LINUX-32-STATIC-NEXT: addl $12, %esp
; LINUX-32-STATIC-NEXT: retl
;
Expand Down
8 changes: 4 additions & 4 deletions llvm/test/CodeGen/X86/absolute-cmp.ll
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ define void @foo8(i64 %val) {
; NOPIC-NEXT: # %bb.1: # %t
; NOPIC-NEXT: pushq %rax # encoding: [0x50]
; NOPIC-NEXT: .cfi_def_cfa_offset 16
; NOPIC-NEXT: callq f # encoding: [0xe8,A,A,A,A]
; NOPIC-NEXT: # fixup A - offset: 1, value: f-4, kind: reloc_branch_4byte_pcrel
; NOPIC-NEXT: callq f@PLT # encoding: [0xe8,A,A,A,A]
; NOPIC-NEXT: # fixup A - offset: 1, value: f@PLT-4, kind: FK_PCRel_4
; NOPIC-NEXT: popq %rax # encoding: [0x58]
; NOPIC-NEXT: .cfi_def_cfa_offset 8
; NOPIC-NEXT: .LBB0_2: # %f
Expand Down Expand Up @@ -63,8 +63,8 @@ define void @foo32(i64 %val) {
; NOPIC-NEXT: # %bb.1: # %t
; NOPIC-NEXT: pushq %rax # encoding: [0x50]
; NOPIC-NEXT: .cfi_def_cfa_offset 16
; NOPIC-NEXT: callq f # encoding: [0xe8,A,A,A,A]
; NOPIC-NEXT: # fixup A - offset: 1, value: f-4, kind: reloc_branch_4byte_pcrel
; NOPIC-NEXT: callq f@PLT # encoding: [0xe8,A,A,A,A]
; NOPIC-NEXT: # fixup A - offset: 1, value: f@PLT-4, kind: FK_PCRel_4
; NOPIC-NEXT: popq %rax # encoding: [0x58]
; NOPIC-NEXT: .cfi_def_cfa_offset 8
; NOPIC-NEXT: .LBB1_2: # %f
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/X86/absolute-constant.ll
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ define void @bar(i8* %x) {
; CHECK-NEXT: je .LBB0_1
; CHECK-NEXT: # %bb.2: # %if.then
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: jmp xf # TAILCALL
; CHECK-NEXT: jmp xf@PLT # TAILCALL
; CHECK-NEXT: .LBB0_1: # %if.end
; CHECK-NEXT: retq
;
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/CodeGen/X86/code-model-elf.ll
Original file line number Diff line number Diff line change
Expand Up @@ -341,12 +341,12 @@ define dso_local void ()* @lea_global_fn() #0 {
define dso_local void ()* @lea_extern_fn() #0 {
; SMALL-STATIC-LABEL: lea_extern_fn:
; SMALL-STATIC: # %bb.0:
; SMALL-STATIC-NEXT: movl $extern_fn, %eax
; SMALL-STATIC-NEXT: movq extern_fn@{{.*}}(%rip), %rax
; SMALL-STATIC-NEXT: retq
;
; MEDIUM-STATIC-LABEL: lea_extern_fn:
; MEDIUM-STATIC: # %bb.0:
; MEDIUM-STATIC-NEXT: movabsq $extern_fn, %rax
; MEDIUM-STATIC-NEXT: movq extern_fn@{{.*}}(%rip), %rax
; MEDIUM-STATIC-NEXT: retq
;
; LARGE-STATIC-LABEL: lea_extern_fn:
Expand Down
40 changes: 20 additions & 20 deletions llvm/test/CodeGen/X86/conditional-tailcall-pgso.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,24 @@ define void @f(i32 %x, i32 %y) !prof !14 {
; CHECK32: # %bb.0: # %entry
; CHECK32-NEXT: movl {{[0-9]+}}(%esp), %eax # encoding: [0x8b,0x44,0x24,0x04]
; CHECK32-NEXT: cmpl {{[0-9]+}}(%esp), %eax # encoding: [0x3b,0x44,0x24,0x08]
; CHECK32-NEXT: jne bar # TAILCALL
; CHECK32-NEXT: jne bar@PLT # TAILCALL
; CHECK32-NEXT: # encoding: [0x75,A]
; CHECK32-NEXT: # fixup A - offset: 1, value: bar-1, kind: FK_PCRel_1
; CHECK32-NEXT: # fixup A - offset: 1, value: bar@PLT-1, kind: FK_PCRel_1
; CHECK32-NEXT: # %bb.1: # %bb1
; CHECK32-NEXT: jmp foo # TAILCALL
; CHECK32-NEXT: jmp foo@PLT # TAILCALL
; CHECK32-NEXT: # encoding: [0xeb,A]
; CHECK32-NEXT: # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
; CHECK32-NEXT: # fixup A - offset: 1, value: foo@PLT-1, kind: FK_PCRel_1
;
; CHECK64-LABEL: f:
; CHECK64: # %bb.0: # %entry
; CHECK64-NEXT: cmpl %esi, %edi # encoding: [0x39,0xf7]
; CHECK64-NEXT: jne bar # TAILCALL
; CHECK64-NEXT: jne bar@PLT # TAILCALL
; CHECK64-NEXT: # encoding: [0x75,A]
; CHECK64-NEXT: # fixup A - offset: 1, value: bar-1, kind: FK_PCRel_1
; CHECK64-NEXT: # fixup A - offset: 1, value: bar@PLT-1, kind: FK_PCRel_1
; CHECK64-NEXT: # %bb.1: # %bb1
; CHECK64-NEXT: jmp foo # TAILCALL
; CHECK64-NEXT: jmp foo@PLT # TAILCALL
; CHECK64-NEXT: # encoding: [0xeb,A]
; CHECK64-NEXT: # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
; CHECK64-NEXT: # fixup A - offset: 1, value: foo@PLT-1, kind: FK_PCRel_1
;
; WIN64-LABEL: f:
; WIN64: # %bb.0: # %entry
Expand Down Expand Up @@ -68,16 +68,16 @@ define void @f_non_leaf(i32 %x, i32 %y) !prof !14 {
; CHECK32-NEXT: # %bb.1: # %bb1
; CHECK32-NEXT: popl %ebx # encoding: [0x5b]
; CHECK32-NEXT: .cfi_def_cfa_offset 4
; CHECK32-NEXT: jmp foo # TAILCALL
; CHECK32-NEXT: jmp foo@PLT # TAILCALL
; CHECK32-NEXT: # encoding: [0xeb,A]
; CHECK32-NEXT: # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
; CHECK32-NEXT: # fixup A - offset: 1, value: foo@PLT-1, kind: FK_PCRel_1
; CHECK32-NEXT: .LBB1_2: # %bb2
; CHECK32-NEXT: .cfi_def_cfa_offset 8
; CHECK32-NEXT: popl %ebx # encoding: [0x5b]
; CHECK32-NEXT: .cfi_def_cfa_offset 4
; CHECK32-NEXT: jmp bar # TAILCALL
; CHECK32-NEXT: jmp bar@PLT # TAILCALL
; CHECK32-NEXT: # encoding: [0xeb,A]
; CHECK32-NEXT: # fixup A - offset: 1, value: bar-1, kind: FK_PCRel_1
; CHECK32-NEXT: # fixup A - offset: 1, value: bar@PLT-1, kind: FK_PCRel_1
;
; CHECK64-LABEL: f_non_leaf:
; CHECK64: # %bb.0: # %entry
Expand All @@ -92,16 +92,16 @@ define void @f_non_leaf(i32 %x, i32 %y) !prof !14 {
; CHECK64-NEXT: # %bb.1: # %bb1
; CHECK64-NEXT: popq %rbx # encoding: [0x5b]
; CHECK64-NEXT: .cfi_def_cfa_offset 8
; CHECK64-NEXT: jmp foo # TAILCALL
; CHECK64-NEXT: jmp foo@PLT # TAILCALL
; CHECK64-NEXT: # encoding: [0xeb,A]
; CHECK64-NEXT: # fixup A - offset: 1, value: foo-1, kind: FK_PCRel_1
; CHECK64-NEXT: # fixup A - offset: 1, value: foo@PLT-1, kind: FK_PCRel_1
; CHECK64-NEXT: .LBB1_2: # %bb2
; CHECK64-NEXT: .cfi_def_cfa_offset 16
; CHECK64-NEXT: popq %rbx # encoding: [0x5b]
; CHECK64-NEXT: .cfi_def_cfa_offset 8
; CHECK64-NEXT: jmp bar # TAILCALL
; CHECK64-NEXT: jmp bar@PLT # TAILCALL
; CHECK64-NEXT: # encoding: [0xeb,A]
; CHECK64-NEXT: # fixup A - offset: 1, value: bar-1, kind: FK_PCRel_1
; CHECK64-NEXT: # fixup A - offset: 1, value: bar@PLT-1, kind: FK_PCRel_1
;
; WIN64-LABEL: f_non_leaf:
; WIN64: # %bb.0: # %entry
Expand Down Expand Up @@ -152,9 +152,9 @@ define x86_thiscallcc zeroext i1 @BlockPlacementTest(i8* %this, i32 %x) !prof !1
; CHECK32-NEXT: # %bb.1: # %land.rhs
; CHECK32-NEXT: movb $1, %al # encoding: [0xb0,0x01]
; CHECK32-NEXT: testb $44, %dl # encoding: [0xf6,0xc2,0x2c]
; CHECK32-NEXT: je baz # TAILCALL
; CHECK32-NEXT: je baz@PLT # TAILCALL
; CHECK32-NEXT: # encoding: [0x74,A]
; CHECK32-NEXT: # fixup A - offset: 1, value: baz-1, kind: FK_PCRel_1
; CHECK32-NEXT: # fixup A - offset: 1, value: baz@PLT-1, kind: FK_PCRel_1
; CHECK32-NEXT: .LBB2_2: # %land.end
; CHECK32-NEXT: # kill: def $al killed $al killed $eax
; CHECK32-NEXT: retl $4 # encoding: [0xc2,0x04,0x00]
Expand All @@ -171,9 +171,9 @@ define x86_thiscallcc zeroext i1 @BlockPlacementTest(i8* %this, i32 %x) !prof !1
; CHECK64-NEXT: # %bb.1: # %land.rhs
; CHECK64-NEXT: movb $1, %al # encoding: [0xb0,0x01]
; CHECK64-NEXT: testb $44, %sil # encoding: [0x40,0xf6,0xc6,0x2c]
; CHECK64-NEXT: je baz # TAILCALL
; CHECK64-NEXT: je baz@PLT # TAILCALL
; CHECK64-NEXT: # encoding: [0x74,A]
; CHECK64-NEXT: # fixup A - offset: 1, value: baz-1, kind: FK_PCRel_1
; CHECK64-NEXT: # fixup A - offset: 1, value: baz@PLT-1, kind: FK_PCRel_1
; CHECK64-NEXT: .LBB2_2: # %land.end
; CHECK64-NEXT: # kill: def $al killed $al killed $eax
; CHECK64-NEXT: retq # encoding: [0xc3]
Expand Down
Loading

0 comments on commit a084c03

Please sign in to comment.