; Test to ensure we don't internalize or treat as dead a global value ; with a valid C identifier section name. Otherwise, ELF linker generation of ; __start_"sectionname" and __stop_"sectionname" symbols would not occur and ; we can end up with undefined references at link time. ; First try RegularLTO ; RUN: opt %s -o %t.o ; RUN: llvm-lto2 dump-symtab %t.o | FileCheck %s --check-prefix=SYMTAB ; RUN: opt %p/Inputs/global_with_section.ll -o %t2.o ; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext \ ; RUN: --plugin-opt=save-temps \ ; RUN: -o %t3.o %t.o %t2.o ; Check results of internalization ; RUN: llvm-dis %t3.o.0.2.internalize.bc -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK2-REGULARLTO ; Next try ThinLTO ; RUN: opt -module-summary %s -o %t.o ; RUN: llvm-lto2 dump-symtab %t.o | FileCheck %s --check-prefix=SYMTAB ; RUN: opt -module-summary %p/Inputs/global_with_section.ll -o %t2.o ; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext \ ; RUN: --plugin-opt=thinlto \ ; RUN: --plugin-opt=save-temps \ ; RUN: -o %t3.o %t.o %t2.o ; Check results of internalization ; RUN: llvm-dis %t.o.2.internalize.bc -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-THINLTO ; RUN: llvm-dis %t2.o.2.internalize.bc -o - | FileCheck %s --check-prefix=CHECK2-THINLTO ; SYMTAB: deadfunc_with_section ; SYMTAB-NEXT: section some_other_section ; SYMTAB-NEXT: deadfunc_with_nonC_section ; SYMTAB-NEXT: section .nonCsection ; SYMTAB-NEXT: deadfunc2_called_from_section ; SYMTAB-NEXT: deadfunc2_called_from_nonC_section ; SYMTAB-NEXT: var_with_section ; SYMTAB-NEXT: section some_section ; SYMTAB-NEXT: var_with_nonC_section ; SYMTAB-NEXT: section .nonCsection target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" ; We should not internalize @var_with_section due to section ; CHECK-DAG: @var_with_section = dso_local global i32 0, section "some_section" @var_with_section = global i32 0, section "some_section" ; Confirm via a variable with a non-C identifier section that we are getting ; the expected internalization. ; CHECK-REGULARLTO-DAG: @var_with_nonC_section = internal global i32 0, section ".nonCsection" ; Check we dropped definition of dead variable. ; CHECK-THINLTO-NOT: @var_with_nonC_section @var_with_nonC_section = global i32 0, section ".nonCsection" ; We should not internalize @deadfunc_with_section due to section ; CHECK-DAG: define dso_local void @deadfunc_with_section() section "some_other_section" define void @deadfunc_with_section() section "some_other_section" { call void @deadfunc2_called_from_section() ret void } ; Confirm via a function with a non-C identifier section that we are getting ; the expected internalization. ; CHECK2-REGULARLTO-DAG: define internal void @deadfunc_with_nonC_section() section ".nonCsection" ; Check dead function converted to declaration. ; CHECK-THINLTO-NOT: @deadfunc_with_nonC_section() define void @deadfunc_with_nonC_section() section ".nonCsection" { call void @deadfunc2_called_from_nonC_section() ret void } ; In RegularLTO mode, where we have combined all the IR, ; @deadfunc2_called_from_section can be internalized. ; CHECK2-REGULARLTO: define internal void @deadfunc2_called_from_section ; In ThinLTO mode, we can't internalize it as it needs to be preserved ; (due to the access from @deadfunc_with_section which must be preserved), and ; can't be internalized since the reference is from a different module. ; CHECK2-THINLTO: define dso_local void @deadfunc2_called_from_section declare void @deadfunc2_called_from_section() ; Confirm when called from a function with a non-C identifier section that we ; are getting the expected internalization. ; CHECK2-REGULARLTO: define internal void @deadfunc2_called_from_nonC_section ; Check dead function converted to declaration. ; CHECK2-THINLTO-NOT: @deadfunc2_called_from_nonC_section declare void @deadfunc2_called_from_nonC_section()