diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -2264,9 +2264,8 @@ // Add "sample-profile-suffix-elision-policy" attribute for internal linkage // functions with -funique-internal-linkage-names. if (TargetDecl && CodeGenOpts.UniqueInternalLinkageNames) { - if (isa(TargetDecl)) { - if (this->getFunctionLinkage(CalleeInfo.getCalleeDecl()) == - llvm::GlobalValue::InternalLinkage) + if (const auto *FD = dyn_cast_or_null(TargetDecl)) { + if (!FD->isExternallyVisible()) FuncAttrs.addAttribute("sample-profile-suffix-elision-policy", "selected"); } diff --git a/clang/test/CodeGen/unique-internal-linkage-names.c b/clang/test/CodeGen/unique-internal-linkage-names.c new file mode 100644 --- /dev/null +++ b/clang/test/CodeGen/unique-internal-linkage-names.c @@ -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"