[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:
Ellis Hoag 2022-10-13 16:38:02 -07:00
parent 6102364b0d
commit 970e1ea01a
2 changed files with 20 additions and 3 deletions

View File

@ -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");
}

View 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"