[PATCH] D117190: [GlobalValue] Make dso_local function work with comdat nodeduplicate
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 13 16:32:33 PST 2022
MaskRay updated this revision to Diff 399834.
MaskRay edited the summary of this revision.
MaskRay added a comment.
Fix CodeGenCUDA/usual-deallocators.cu (strange default visibility external linkage comdat)
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D117190/new/
https://reviews.llvm.org/D117190
Files:
llvm/lib/IR/Globals.cpp
llvm/test/CodeGen/X86/linux-preemption.ll
Index: llvm/test/CodeGen/X86/linux-preemption.ll
===================================================================
--- llvm/test/CodeGen/X86/linux-preemption.ll
+++ llvm/test/CodeGen/X86/linux-preemption.ll
@@ -252,6 +252,32 @@
; STATIC: movq external_preemptable_function at GOTPCREL(%rip), %rax
; CHECK32: movl external_preemptable_function at GOT(%eax), %eax
+$comdat_nodeduplicate_local = comdat nodeduplicate
+$comdat_nodeduplicate_preemptable = comdat nodeduplicate
+$comdat_any_local = comdat any
+
+;; -fpic -fno-semantic-interposition may add dso_local. Some instrumentation
+;; may add comdat nodeduplicate. We should use local aliases to make the symbol
+;; non-preemptible in the linker.
+define dso_local i8* @comdat_nodeduplicate_local() comdat {
+ ret i8* bitcast (i8* ()* @comdat_nodeduplicate_local to i8*)
+}
+; CHECK: leaq .Lcomdat_nodeduplicate_local$local(%rip), %rax
+; STATIC: movl $comdat_nodeduplicate_local, %eax
+
+define dso_preemptable i8* @comdat_nodeduplicate_preemptable() comdat {
+ ret i8* bitcast (i8* ()* @comdat_nodeduplicate_preemptable to i8*)
+}
+; CHECK: movq comdat_nodeduplicate_preemptable at GOTPCREL(%rip), %rax
+; STATIC: movq comdat_nodeduplicate_preemptable at GOTPCREL(%rip), %rax
+
+;; The desired behavior is unclear.
+define dso_local i8* @comdat_any_local() comdat {
+ ret i8* bitcast (i8* ()* @comdat_any_local to i8*)
+}
+; CHECK: leaq comdat_any_local(%rip), %rax
+; STATIC: movl $comdat_any_local, %eax
+
!llvm.module.flags = !{!0}
!0 = !{i32 7, !"PIC Level", i32 2}
Index: llvm/lib/IR/Globals.cpp
===================================================================
--- llvm/lib/IR/Globals.cpp
+++ llvm/lib/IR/Globals.cpp
@@ -105,10 +105,15 @@
}
bool GlobalValue::canBenefitFromLocalAlias() const {
- // See AsmPrinter::getSymbolPreferLocal().
+ // See AsmPrinter::getSymbolPreferLocal(). For a deduplicate comdat kind,
+ // references to this symbol table entry from outside the group are not
+ // allowed, so exclude it.
+ auto isDeduplicateComdat = [](const Comdat *C) {
+ return C && C->getSelectionKind() != Comdat::NoDeduplicate;
+ };
return hasDefaultVisibility() &&
GlobalObject::isExternalLinkage(getLinkage()) && !isDeclaration() &&
- !isa<GlobalIFunc>(this) && !hasComdat();
+ !isa<GlobalIFunc>(this) && !isDeduplicateComdat(getComdat());
}
unsigned GlobalValue::getAddressSpace() const {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D117190.399834.patch
Type: text/x-patch
Size: 2405 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220114/3219cdbb/attachment.bin>
More information about the llvm-commits
mailing list