mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-05 00:48:08 +00:00
[clang] Fix crash with -funique-internal-linkage-names
Calling `getFunctionLinkage(CalleeInfo.getCalleeDecl())` will crash when the declaration does not have a body, e.g., `extern void foo();`. Instead, we can use `isExternallyVisible()` to see if the delcaration has internal linkage.
I believe using `!isExternallyVisible()` is correct because the clang linkage must be `InternalLinkage` or `UniqueExternalLinkage`, both of which are "internal linkage" in llvm.
9c26f51f5e/clang/include/clang/Basic/Linkage.h (L28-L40)
Fixes https://github.com/llvm/llvm-project/issues/54139
Reviewed By: tmsriram
Differential Revision: https://reviews.llvm.org/D135926
This commit is contained in:
parent
6102364b0d
commit
970e1ea01a
@ -2264,9 +2264,8 @@ void CodeGenModule::ConstructAttributeList(StringRef Name,
|
||||
// Add "sample-profile-suffix-elision-policy" attribute for internal linkage
|
||||
// functions with -funique-internal-linkage-names.
|
||||
if (TargetDecl && CodeGenOpts.UniqueInternalLinkageNames) {
|
||||
if (isa<FunctionDecl>(TargetDecl)) {
|
||||
if (this->getFunctionLinkage(CalleeInfo.getCalleeDecl()) ==
|
||||
llvm::GlobalValue::InternalLinkage)
|
||||
if (const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
|
||||
if (!FD->isExternallyVisible())
|
||||
FuncAttrs.addAttribute("sample-profile-suffix-elision-policy",
|
||||
"selected");
|
||||
}
|
||||
|
18
clang/test/CodeGen/unique-internal-linkage-names.c
Normal file
18
clang/test/CodeGen/unique-internal-linkage-names.c
Normal file
@ -0,0 +1,18 @@
|
||||
// RUN: %clang_cc1 %s -S -emit-llvm -funique-internal-linkage-names -o - | FileCheck %s
|
||||
|
||||
// Check that we do not crash when overloading extern functions.
|
||||
|
||||
inline void overloaded_external() {}
|
||||
extern void overloaded_external();
|
||||
|
||||
// CHECK: define internal void @overloaded_internal() [[ATTR:#[0-9]+]] {
|
||||
static void overloaded_internal() {}
|
||||
extern void overloaded_internal();
|
||||
|
||||
void markUsed() {
|
||||
overloaded_external();
|
||||
overloaded_internal();
|
||||
}
|
||||
|
||||
// CHECK: attributes [[ATTR]] =
|
||||
// CHECK-SAME: "sample-profile-suffix-elision-policy"="selected"
|
Loading…
x
Reference in New Issue
Block a user