[clang] acd3fcf - [clang] Emit call graph type metadata for internal linkage symbols (#210194)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Jul 18 08:59:25 PDT 2026
Author: Prabhu Rajasekaran
Date: 2026-07-18T08:59:20-07:00
New Revision: acd3fcfdd6d065f914eadbe2036e703c056b4ccc
URL: https://github.com/llvm/llvm-project/commit/acd3fcfdd6d065f914eadbe2036e703c056b4ccc
DIFF: https://github.com/llvm/llvm-project/commit/acd3fcfdd6d065f914eadbe2036e703c056b4ccc.diff
LOG: [clang] Emit call graph type metadata for internal linkage symbols (#210194)
Added:
Modified:
clang/lib/CodeGen/CodeGenModule.cpp
clang/lib/CodeGen/CodeGenModule.h
clang/test/CodeGen/call-graph-section-callback.cpp
clang/test/CodeGen/call-graph-section-internal.cpp
clang/test/CodeGen/call-graph-section-templates.cpp
clang/test/CodeGen/call-graph-section-virtual-methods.cpp
clang/test/CodeGen/call-graph-section.c
clang/test/CodeGen/call-graph-section.cpp
llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
llvm/lib/CodeGen/MachineFunction.cpp
llvm/lib/IR/Verifier.cpp
llvm/test/CodeGen/ARM/call-graph-section-addrtaken.ll
llvm/test/CodeGen/ARM/call-graph-section-assembly.ll
llvm/test/CodeGen/ARM/call-graph-section-tailcall.ll
llvm/test/CodeGen/ARM/call-graph-section.ll
llvm/test/CodeGen/X86/call-graph-section-addrtaken.ll
llvm/test/CodeGen/X86/call-graph-section-assembly.ll
llvm/test/CodeGen/X86/call-graph-section-tailcall.ll
llvm/test/CodeGen/X86/call-graph-section.ll
llvm/test/Verifier/callee-type-metadata.ll
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index d1119e6c00d14..5f5fc4401bb4e 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -3461,10 +3461,11 @@ void CodeGenModule::createIndirectFunctionTypeMD(const FunctionDecl *FD,
F->getFunction().hasAddressTaken(nullptr, /*IgnoreCallbackUses=*/true,
/*IgnoreAssumeLikeCalls=*/true,
/*IgnoreLLVMUsed=*/false)) {
- F->addMetadata(llvm::LLVMContext::MD_callgraph,
- *llvm::MDTuple::get(
- getLLVMContext(),
- {CreateMetadataIdentifierGeneralized(FD->getType())}));
+ F->addMetadata(
+ llvm::LLVMContext::MD_callgraph,
+ *llvm::MDTuple::get(
+ getLLVMContext(),
+ {CreateMetadataIdentifierForCallGraphType(FD->getType())}));
}
}
@@ -3496,15 +3497,11 @@ void CodeGenModule::createFunctionTypeMetadataForIcall(const FunctionDecl *FD,
void CodeGenModule::createCalleeTypeMetadataForIcall(const QualType &QT,
llvm::CallBase *CB) {
- // Only if needed for call graph section and only for indirect calls that are
- // visible externally.
- // TODO: Handle local linkage symbols so they are not left out of call graph
- // reducing precision.
- if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall() ||
- !isExternallyVisible(QT->getLinkage()))
+ // Only if needed for call graph section and only for indirect calls
+ if (!CodeGenOpts.CallGraphSection || !CB->isIndirectCall())
return;
- llvm::Metadata *TypeIdMD = CreateMetadataIdentifierGeneralized(QT);
+ llvm::Metadata *TypeIdMD = CreateMetadataIdentifierForCallGraphType(QT);
llvm::MDTuple *TypeTuple = llvm::MDTuple::get(getLLVMContext(), {TypeIdMD});
llvm::MDTuple *MDN = llvm::MDNode::get(getLLVMContext(), {TypeTuple});
CB->setMetadata(llvm::LLVMContext::MD_callee_type, MDN);
@@ -8577,9 +8574,8 @@ void CodeGenModule::EmitOMPThreadPrivateDecl(const OMPThreadPrivateDecl *D) {
}
}
-llvm::Metadata *
-CodeGenModule::CreateMetadataIdentifierImpl(QualType T, MetadataTypeMap &Map,
- StringRef Suffix) {
+llvm::Metadata *CodeGenModule::CreateMetadataIdentifierImpl(
+ QualType T, MetadataTypeMap &Map, StringRef Suffix, bool ForceString) {
if (auto *FnType = T->getAs<FunctionProtoType>())
T = getContext().getFunctionType(
FnType->getReturnType(), FnType->getParamTypes(),
@@ -8589,7 +8585,7 @@ CodeGenModule::CreateMetadataIdentifierImpl(QualType T, MetadataTypeMap &Map,
if (InternalId)
return InternalId;
- if (isExternallyVisible(T->getLinkage())) {
+ if (ForceString || isExternallyVisible(T->getLinkage())) {
std::string OutName;
llvm::raw_string_ostream Out(OutName);
getCXXABI().getMangleContext().mangleCanonicalTypeName(
@@ -8629,7 +8625,13 @@ CodeGenModule::CreateMetadataIdentifierForVirtualMemPtrType(QualType T) {
llvm::Metadata *CodeGenModule::CreateMetadataIdentifierGeneralized(QualType T) {
return CreateMetadataIdentifierImpl(T, GeneralizedMetadataIdMap,
- ".generalized");
+ ".generalized", /*ForceString=*/false);
+}
+
+llvm::Metadata *
+CodeGenModule::CreateMetadataIdentifierForCallGraphType(QualType T) {
+ return CreateMetadataIdentifierImpl(T, CallGraphMetadataIdMap, "",
+ /*ForceString=*/true);
}
/// Returns whether this module needs the "all-vtables" type identifier.
diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h
index f62c761be0184..54b08b588dfde 100644
--- a/clang/lib/CodeGen/CodeGenModule.h
+++ b/clang/lib/CodeGen/CodeGenModule.h
@@ -708,6 +708,7 @@ class CodeGenModule : public CodeGenTypeCache {
MetadataTypeMap MetadataIdMap;
MetadataTypeMap VirtualMetadataIdMap;
MetadataTypeMap GeneralizedMetadataIdMap;
+ MetadataTypeMap CallGraphMetadataIdMap;
// Helps squashing blocks of TopLevelStmtDecl into a single llvm::Function
// when used with -fincremental-extensions.
@@ -1760,6 +1761,11 @@ class CodeGenModule : public CodeGenTypeCache {
/// internal identifiers).
llvm::Metadata *CreateMetadataIdentifierForType(QualType T);
+ /// Create a metadata identifier for the Call Graph Section.
+ /// This is a generalized type identifier that is guaranteed to be an
+ /// MDString.
+ llvm::Metadata *CreateMetadataIdentifierForCallGraphType(QualType T);
+
/// Create a metadata identifier that is intended to be used to check virtual
/// calls via a member function pointer.
llvm::Metadata *CreateMetadataIdentifierForVirtualMemPtrType(QualType T);
@@ -2199,7 +2205,8 @@ class CodeGenModule : public CodeGenTypeCache {
llvm::AttrBuilder &FuncAttrs);
llvm::Metadata *CreateMetadataIdentifierImpl(QualType T, MetadataTypeMap &Map,
- StringRef Suffix);
+ StringRef Suffix,
+ bool ForceString = false);
/// Emit deactivation symbols for any PFP fields whose offset is taken with
/// offsetof.
diff --git a/clang/test/CodeGen/call-graph-section-callback.cpp b/clang/test/CodeGen/call-graph-section-callback.cpp
index c943050d6d59f..bac4e87c4f7db 100644
--- a/clang/test/CodeGen/call-graph-section-callback.cpp
+++ b/clang/test/CodeGen/call-graph-section-callback.cpp
@@ -27,4 +27,4 @@ int takeCallbackAddress() {
return 0;
}
-// CHECK: [[F_CALLBACK]] = !{!"_ZTSFviE.generalized"}
+// CHECK: [[F_CALLBACK]] = !{!"_ZTSFviE"}
diff --git a/clang/test/CodeGen/call-graph-section-internal.cpp b/clang/test/CodeGen/call-graph-section-internal.cpp
index 923cb4ed053b0..3f7c7a0bd48cc 100644
--- a/clang/test/CodeGen/call-graph-section-internal.cpp
+++ b/clang/test/CodeGen/call-graph-section-internal.cpp
@@ -1,9 +1,8 @@
// RUN: %clang_cc1 -triple x86_64-unknown-linux -fexperimental-call-graph-section -disable-llvm-passes -emit-llvm -o - %s | FileCheck %s
-// Check that we do not generate callee_type metadata for indirect calls
+// Check that we generate callee_type metadata for indirect calls
// to functions with internal linkage (e.g., types in anonymous namespaces),
-// as their callgraph metadata identifiers are distinct MDNodes instead of
-// generalized strings, which would fail the LLVM Verifier.
+// using the generalized type metadata form.
namespace {
class a;
@@ -32,6 +31,8 @@ void test() {
// CHECK-LABEL: define {{.*}} void @{{.*}}1a1dEv
// CHECK: %[[VFN:.*]] = getelementptr inbounds ptr, ptr %{{.*}}, i{{[0-9]+}} 0
// CHECK: %[[FP:.*]] = load ptr, ptr %[[VFN]], align {{[0-9]+}}
-// CHECK: call void %[[FP]]({{.*}})
-// CHECK-NOT: !callee_type
+// CHECK: call void %[[FP]]({{.*}}), !callee_type [[HEX_TYPE:![0-9]+]]
// CHECK: ret void
+
+// CHECK: [[HEX_TYPE]] = !{[[HEX_TYPE_INNER:![0-9]+]]}
+// CHECK: [[HEX_TYPE_INNER]] = !{!"_ZTSFvN12_GLOBAL__N_11aEE"}
diff --git a/clang/test/CodeGen/call-graph-section-templates.cpp b/clang/test/CodeGen/call-graph-section-templates.cpp
index c26170585e8fd..6ad8648ab8095 100644
--- a/clang/test/CodeGen/call-graph-section-templates.cpp
+++ b/clang/test/CodeGen/call-graph-section-templates.cpp
@@ -44,12 +44,12 @@ class Cls2 {
T *(*fp)(T a, T *b, const T *c, T &d, const T &e);
};
-// FT: [[F_TCLS2F1]] = !{!"_ZTSFvvE.generalized"}
-// FT: [[F_TCLS2F2]] = !{!"_ZTSFv4Cls1E.generalized"}
-// FT: [[F_TCLS2F3]] = !{!"_ZTSFvP4Cls1E.generalized"}
-// FT: [[F_TCLS2F4]] = !{!"_ZTSFvPK4Cls1E.generalized"}
-// FT: [[F_TCLS2F5]] = !{!"_ZTSFvR4Cls1E.generalized"}
-// FT: [[F_TCLS2F6]] = !{!"_ZTSFvRK4Cls1E.generalized"}
+// FT: [[F_TCLS2F1]] = !{!"_ZTSFvvE"}
+// FT: [[F_TCLS2F2]] = !{!"_ZTSFv4Cls1E"}
+// FT: [[F_TCLS2F3]] = !{!"_ZTSFvP4Cls1E"}
+// FT: [[F_TCLS2F4]] = !{!"_ZTSFvPK4Cls1E"}
+// FT: [[F_TCLS2F5]] = !{!"_ZTSFvR4Cls1E"}
+// FT: [[F_TCLS2F6]] = !{!"_ZTSFvRK4Cls1E"}
////////////////////////////////////////////////////////////////////////////////
// Callsites (check for indirect callsite operand bundles)
@@ -101,17 +101,17 @@ void foo() {
// CST-LABEL: define {{.*}} @_Z6T_funcI4Cls1EPT_S1_S2_PKS1_RS1_RS3_(
// CST-SAME: {{.*}} !callgraph [[F_TFUNC_CLS1:![0-9]+]]
-// CST: [[F_TCLS2F1]] = !{!"_ZTSFvvE.generalized"}
+// CST: [[F_TCLS2F1]] = !{!"_ZTSFvvE"}
// CST: [[F_TFUNC_CLS1_CT]] = !{[[F_TFUNC_CLS1:![0-9]+]]}
-// CST: [[F_TFUNC_CLS1]] = !{!"_ZTSFP4Cls1S_S0_PKS_RS_RS1_E.generalized"}
+// CST: [[F_TFUNC_CLS1]] = !{!"_ZTSFP4Cls1S_S0_PKS_RS_RS1_E"}
// CST: [[F_TCLS2F1_CT]] = !{[[F_TCLS2F1:![0-9]+]]}
// CST: [[F_TCLS2F2_CT]] = !{[[F_TCLS2F2:![0-9]+]]}
-// CST: [[F_TCLS2F2]] = !{!"_ZTSFv4Cls1E.generalized"}
+// CST: [[F_TCLS2F2]] = !{!"_ZTSFv4Cls1E"}
// CST: [[F_TCLS2F3_CT]] = !{[[F_TCLS2F3:![0-9]+]]}
-// CST: [[F_TCLS2F3]] = !{!"_ZTSFvP4Cls1E.generalized"}
+// CST: [[F_TCLS2F3]] = !{!"_ZTSFvP4Cls1E"}
// CST: [[F_TCLS2F4_CT]] = !{[[F_TCLS2F4:![0-9]+]]}
-// CST: [[F_TCLS2F4]] = !{!"_ZTSFvPK4Cls1E.generalized"}
+// CST: [[F_TCLS2F4]] = !{!"_ZTSFvPK4Cls1E"}
// CST: [[F_TCLS2F5_CT]] = !{[[F_TCLS2F5:![0-9]+]]}
-// CST: [[F_TCLS2F5]] = !{!"_ZTSFvR4Cls1E.generalized"}
+// CST: [[F_TCLS2F5]] = !{!"_ZTSFvR4Cls1E"}
// CST: [[F_TCLS2F6_CT]] = !{[[F_TCLS2F6:![0-9]+]]}
-// CST: [[F_TCLS2F6]] = !{!"_ZTSFvRK4Cls1E.generalized"}
+// CST: [[F_TCLS2F6]] = !{!"_ZTSFvRK4Cls1E"}
diff --git a/clang/test/CodeGen/call-graph-section-virtual-methods.cpp b/clang/test/CodeGen/call-graph-section-virtual-methods.cpp
index 34c22c467080b..bd5555a815496 100644
--- a/clang/test/CodeGen/call-graph-section-virtual-methods.cpp
+++ b/clang/test/CodeGen/call-graph-section-virtual-methods.cpp
@@ -22,7 +22,7 @@ class Base {
int vf(char *a) override { return 1; };
};
- // FT: [[F_TVF]] = !{!"_ZTSFiPcE.generalized"}
+ // FT: [[F_TVF]] = !{!"_ZTSFiPcE"}
////////////////////////////////////////////////////////////////////////////////
// Callsites (check for indirect callsite operand bundles)
@@ -53,4 +53,4 @@ class Base {
}
// CST: [[F_TVF_CT]] = !{[[F_TVF:![0-9]+]]}
- // CST: [[F_TVF]] = !{!"_ZTSFiPcE.generalized"}
+ // CST: [[F_TVF]] = !{!"_ZTSFiPcE"}
diff --git a/clang/test/CodeGen/call-graph-section.c b/clang/test/CodeGen/call-graph-section.c
index 94581674dc5e3..cb2f9015b7ff5 100644
--- a/clang/test/CodeGen/call-graph-section.c
+++ b/clang/test/CodeGen/call-graph-section.c
@@ -74,20 +74,20 @@ void stf() {
fp_stparam(St2, &St2);
}
-// ITANIUM: [[F_TVOID]] = !{!"_ZTSFvE.generalized"}
+// ITANIUM: [[F_TVOID]] = !{!"_ZTSFvE"}
// ITANIUM: [[F_TVOID_CT]] = !{[[F_TVOID:![0-9]+]]}
-// ITANIUM: [[F_TPRIMITIVE]] = !{!"_ZTSFicfdE.generalized"}
-// ITANIUM: [[F_TPTR]] = !{!"_ZTSFPiPcPfPdE.generalized"}
+// ITANIUM: [[F_TPRIMITIVE]] = !{!"_ZTSFicfdE"}
+// ITANIUM: [[F_TPTR]] = !{!"_ZTSFPiPcPfPdE"}
// ITANIUM: [[F_TPRIMITIVE_CT]] = !{[[F_TPRIMITIVE:![0-9]+]]}
// ITANIUM: [[F_TPTR_CT]] = !{[[F_TPTR:![0-9]+]]}
-// ITANIUM: [[F_TSTRUCT]] = !{!"_ZTSFv3st2PS_E.generalized"}
+// ITANIUM: [[F_TSTRUCT]] = !{!"_ZTSFv3st2PS_E"}
// ITANIUM: [[F_TSTRUCT_CT]] = !{[[F_TSTRUCT:![0-9]+]]}
-// MS: [[F_TVOID]] = !{!"?6AX at Z.generalized"}
+// MS: [[F_TVOID]] = !{!"?6AX at Z"}
// MS: [[F_TVOID_CT]] = !{[[F_TVOID:![0-9]+]]}
-// MS: [[F_TPRIMITIVE]] = !{!"?6AHDMN at Z.generalized"}
-// MS: [[F_TPTR]] = !{!"?6APEAHPEADPEAMPEAN at Z.generalized"}
+// MS: [[F_TPRIMITIVE]] = !{!"?6AHDMN at Z"}
+// MS: [[F_TPTR]] = !{!"?6APEAHPEADPEAMPEAN at Z"}
// MS: [[F_TPRIMITIVE_CT]] = !{[[F_TPRIMITIVE:![0-9]+]]}
// MS: [[F_TPTR_CT]] = !{[[F_TPTR:![0-9]+]]}
-// MS: [[F_TSTRUCT]] = !{!"?6AXUst2@@PEAU0@@Z.generalized"}
+// MS: [[F_TSTRUCT]] = !{!"?6AXUst2@@PEAU0@@Z"}
// MS: [[F_TSTRUCT_CT]] = !{[[F_TSTRUCT:![0-9]+]]}
diff --git a/clang/test/CodeGen/call-graph-section.cpp b/clang/test/CodeGen/call-graph-section.cpp
index a358ff9d2d551..d175cc1d03355 100644
--- a/clang/test/CodeGen/call-graph-section.cpp
+++ b/clang/test/CodeGen/call-graph-section.cpp
@@ -57,15 +57,15 @@ class Cls2 {
void f9() const {}
};
-// FT: [[F_TCLS1RECEIVER]] = !{!"_ZTSFPiPcPfE.generalized"}
-// FT: [[F_TCLS2F1]] = !{!"_ZTSFicfdE.generalized"}
-// FT: [[F_TCLS2F2]] = !{!"_ZTSFPiPcPfPdE.generalized"}
-// FT: [[F_TCLS2F3F4]] = !{!"_ZTSFv4Cls1E.generalized"}
-// FT: [[F_TCLS2F5]] = !{!"_ZTSFvP4Cls1E.generalized"}
-// FT: [[F_TCLS2F6]] = !{!"_ZTSFvPK4Cls1E.generalized"}
-// FT: [[F_TCLS2F7]] = !{!"_ZTSFvR4Cls1E.generalized"}
-// FT: [[F_TCLS2F8]] = !{!"_ZTSFvRK4Cls1E.generalized"}
-// FT: [[F_TCLS2F9]] = !{!"_ZTSKFvvE.generalized"}
+// FT: [[F_TCLS1RECEIVER]] = !{!"_ZTSFPiPcPfE"}
+// FT: [[F_TCLS2F1]] = !{!"_ZTSFicfdE"}
+// FT: [[F_TCLS2F2]] = !{!"_ZTSFPiPcPfPdE"}
+// FT: [[F_TCLS2F3F4]] = !{!"_ZTSFv4Cls1E"}
+// FT: [[F_TCLS2F5]] = !{!"_ZTSFvP4Cls1E"}
+// FT: [[F_TCLS2F6]] = !{!"_ZTSFvPK4Cls1E"}
+// FT: [[F_TCLS2F7]] = !{!"_ZTSFvR4Cls1E"}
+// FT: [[F_TCLS2F8]] = !{!"_ZTSFvRK4Cls1E"}
+// FT: [[F_TCLS2F9]] = !{!"_ZTSKFvvE"}
////////////////////////////////////////////////////////////////////////////////
// Callsites (check for indirect callsites' callee_type metadata )
@@ -120,28 +120,28 @@ void foo() {
}
// CST: [[F_TCLS1RECEIVER_CT]] = !{[[F_TCLS1RECEIVER:![0-9]+]]}
-// CST: [[F_TCLS1RECEIVER]] = !{!"_ZTSFPiPcPfE.generalized"}
+// CST: [[F_TCLS1RECEIVER]] = !{!"_ZTSFPiPcPfE"}
// CST: [[F_TCLS2F1_CT]] = !{[[F_TCLS2F1:![0-9]+]]}
-// CST: [[F_TCLS2F1]] = !{!"_ZTSFicfdE.generalized"}
+// CST: [[F_TCLS2F1]] = !{!"_ZTSFicfdE"}
// CST: [[F_TCLS2F2_CT]] = !{[[F_TCLS2F2:![0-9]+]]}
-// CST: [[F_TCLS2F2]] = !{!"_ZTSFPiPcPfPdE.generalized"}
+// CST: [[F_TCLS2F2]] = !{!"_ZTSFPiPcPfPdE"}
// CST: [[F_TCLS2F3F4_CT]] = !{[[F_TCLS2F3F4:![0-9]+]]}
-// CST: [[F_TCLS2F3F4]] = !{!"_ZTSFv4Cls1E.generalized"}
+// CST: [[F_TCLS2F3F4]] = !{!"_ZTSFv4Cls1E"}
// CST: [[F_TCLS2F5_CT]] = !{[[F_TCLS2F5:![0-9]+]]}
-// CST: [[F_TCLS2F5]] = !{!"_ZTSFvP4Cls1E.generalized"}
+// CST: [[F_TCLS2F5]] = !{!"_ZTSFvP4Cls1E"}
// CST: [[F_TCLS2F6_CT]] = !{[[F_TCLS2F6:![0-9]+]]}
-// CST: [[F_TCLS2F6]] = !{!"_ZTSFvPK4Cls1E.generalized"}
+// CST: [[F_TCLS2F6]] = !{!"_ZTSFvPK4Cls1E"}
// CST: [[F_TCLS2F7_CT]] = !{[[F_TCLS2F7:![0-9]+]]}
-// CST: [[F_TCLS2F7]] = !{!"_ZTSFvR4Cls1E.generalized"}
+// CST: [[F_TCLS2F7]] = !{!"_ZTSFvR4Cls1E"}
// CST: [[F_TCLS2F8_CT]] = !{[[F_TCLS2F8:![0-9]+]]}
-// CST: [[F_TCLS2F8]] = !{!"_ZTSFvRK4Cls1E.generalized"}
+// CST: [[F_TCLS2F8]] = !{!"_ZTSFvRK4Cls1E"}
// CST: [[F_TCLS2F9_CT]] = !{[[F_TCLS2F9:![0-9]+]]}
-// CST: [[F_TCLS2F9]] = !{!"_ZTSKFvvE.generalized"}
+// CST: [[F_TCLS2F9]] = !{!"_ZTSKFvvE"}
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index f3ac25f25fcc1..11d39fcff0ff7 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -1756,19 +1756,17 @@ void AsmPrinter::emitStackUsage(const MachineFunction &MF) {
*StackUsageStream << "static\n";
}
-/// Extracts a generalized numeric type identifier of a Function's type from
+/// Extracts a numeric type identifier of a Function's type from
/// callgraph metadata. Returns null if metadata cannot be found.
static ConstantInt *extractNumericCGTypeId(const Function &F) {
SmallVector<MDNode *, 2> Types;
F.getMetadata(LLVMContext::MD_callgraph, Types);
for (const auto &Type : Types) {
if (Type->getNumOperands() == 1 && isa<MDString>(Type->getOperand(0))) {
- MDString *MDGeneralizedTypeId = cast<MDString>(Type->getOperand(0));
- if (MDGeneralizedTypeId->getString().ends_with(".generalized")) {
- uint64_t TypeIdVal = llvm::MD5Hash(MDGeneralizedTypeId->getString());
- IntegerType *Int64Ty = Type::getInt64Ty(F.getContext());
- return ConstantInt::get(Int64Ty, TypeIdVal);
- }
+ MDString *MDTypeId = cast<MDString>(Type->getOperand(0));
+ uint64_t TypeIdVal = llvm::MD5Hash(MDTypeId->getString());
+ IntegerType *Int64Ty = Type::getInt64Ty(F.getContext());
+ return ConstantInt::get(Int64Ty, TypeIdVal);
}
}
return nullptr;
diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp
index bbc5041a9166d..eb4bc02e90ec3 100644
--- a/llvm/lib/CodeGen/MachineFunction.cpp
+++ b/llvm/lib/CodeGen/MachineFunction.cpp
@@ -759,7 +759,7 @@ MachineFunction::CallSiteInfo::CallSiteInfo(const CallBase &CB) {
for (const MDOperand &Op : CalleeTypeList->operands()) {
MDNode *TypeMD = cast<MDNode>(Op);
MDString *TypeIdStr = cast<MDString>(TypeMD->getOperand(0));
- // Compute numeric type id from generalized type id string
+ // Compute numeric type id from type id string
uint64_t TypeIdVal = MD5Hash(TypeIdStr->getString());
IntegerType *Int64Ty = Type::getInt64Ty(CB.getContext());
CalleeTypeIds.push_back(
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index d315372c1371c..28459a39fedae 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -5478,18 +5478,12 @@ void Verifier::visitCalleeTypeMetadata(Instruction &I, MDNode *MD) {
Op);
auto *CallgraphMD = cast<MDNode>(Op);
Check(CallgraphMD->getNumOperands() == 1,
- "Well-formed generalized callgraph metadata must contain exactly one "
+ "Well-formed callgraph metadata must contain exactly one "
"operand",
Op);
Check(isa<MDString>(CallgraphMD->getOperand(0)),
"The operand of callgraph metadata for functions must be an MDString",
Op);
- Check(cast<MDString>(CallgraphMD->getOperand(0))
- ->getString()
- .ends_with(".generalized"),
- "Only generalized callgraph metadata can be part of the callee_type "
- "metadata list",
- Op);
}
}
diff --git a/llvm/test/CodeGen/ARM/call-graph-section-addrtaken.ll b/llvm/test/CodeGen/ARM/call-graph-section-addrtaken.ll
index 3ffdb65aed8dc..705b94b64eecf 100644
--- a/llvm/test/CodeGen/ARM/call-graph-section-addrtaken.ll
+++ b/llvm/test/CodeGen/ARM/call-graph-section-addrtaken.ll
@@ -22,9 +22,9 @@ entry:
ret void
}
-!0 = !{!"_ZTSFvPFviEE.generalized"}
-!1 = !{!"_ZTSFivE.generalized"}
-!2 = !{!"_ZTSFviE.generalized"}
+!0 = !{!"_ZTSFvPFviEE"}
+!1 = !{!"_ZTSFivE"}
+!2 = !{!"_ZTSFviE"}
; CHECK: .section .llvm.callgraph,"o",%llvm_call_graph,.text
;; Version
@@ -33,6 +33,6 @@ entry:
; CHECK-NEXT: .byte 1
;; Function Entry PC
; CHECK-NEXT: .long _ZL10myCallbacki
-;; Function type ID -5212364466660467813
-; CHECK-NEXT: .long 1154849691
-; CHECK-NEXT: .long 3081369122
+;; Function type ID -8738933900360652027
+; CHECK-NEXT: .long 560098053
+; CHECK-NEXT: .long 2260275691
diff --git a/llvm/test/CodeGen/ARM/call-graph-section-assembly.ll b/llvm/test/CodeGen/ARM/call-graph-section-assembly.ll
index 74000dc4337bc..49d6db12abe5a 100644
--- a/llvm/test/CodeGen/ARM/call-graph-section-assembly.ll
+++ b/llvm/test/CodeGen/ARM/call-graph-section-assembly.ll
@@ -29,11 +29,11 @@ entry:
}
!0 = !{!1}
-!1 = !{!"_ZTSFvE.generalized"}
+!1 = !{!"_ZTSFvE"}
!2 = !{!3}
-!3 = !{!"_ZTSFicE.generalized"}
+!3 = !{!"_ZTSFicE"}
!4 = !{!5}
-!5 = !{!"_ZTSFPvS_E.generalized"}
+!5 = !{!"_ZTSFPvS_"}
; CHECK: .section .llvm.callgraph,"o",%llvm_call_graph,.text
;; Version
@@ -54,9 +54,9 @@ entry:
;; Number of unique indirect target type IDs.
; CHECK-NEXT: .byte 3
;; Indirect type IDs.
-; CHECK-NEXT: .long 838288420
-; CHECK-NEXT: .long 1053552373
-; CHECK-NEXT: .long 1505527380
-; CHECK-NEXT: .long 814631809
-; CHECK-NEXT: .long 342417018
-; CHECK-NEXT: .long 2013108216
+; CHECK-NEXT: .long 3869454308
+; CHECK-NEXT: .long 1534046230
+; CHECK-NEXT: .long 1192513734
+; CHECK-NEXT: .long 33125428
+; CHECK-NEXT: .long 2609506087
+; CHECK-NEXT: .long 2269360106
diff --git a/llvm/test/CodeGen/ARM/call-graph-section-tailcall.ll b/llvm/test/CodeGen/ARM/call-graph-section-tailcall.ll
index eeceea7bc73ab..c26220ec4d246 100644
--- a/llvm/test/CodeGen/ARM/call-graph-section-tailcall.ll
+++ b/llvm/test/CodeGen/ARM/call-graph-section-tailcall.ll
@@ -22,13 +22,13 @@ declare !callgraph !2 i32 @foo(i8 signext)
declare !callgraph !2 i32 @bar(i8 signext)
-!0 = !{!"_ZTSFiPvcE.generalized"}
+!0 = !{!"_ZTSFiPvcE"}
!1 = !{!2}
-!2 = !{!"_ZTSFicE.generalized"}
-!3 = !{!"_ZTSFiiE.generalized"}
+!2 = !{!"_ZTSFicE"}
+!3 = !{!"_ZTSFiiE"}
; CHECK: Hex dump of section '.llvm.callgraph':
-; CHECK-NEXT: 0x00000000 00050000 00008e19 0b7f3326 e3000154
-; CHECK-NEXT: 0x00000010 86bc5981 4b8e3000 05000000 00a150b8
-;; Verify that the type id 0x308e4b8159bc8654 is in section.
-; CHECK-NEXT: 0x00000020 3e0cfe3c b2015486 bc59814b 8e30
+; CHECK-NEXT: 0x00000000 00050000 0000d4bf 88b60134 63f001c6
+; CHECK-NEXT: 0x00000010 50144734 74f90100 05000000 00423a34
+;; Verify that the type id 0x144734744701c650 is in section.
+; CHECK-NEXT: 0x00000020 855a01ce 4701c650 14473474 f901
diff --git a/llvm/test/CodeGen/ARM/call-graph-section.ll b/llvm/test/CodeGen/ARM/call-graph-section.ll
index 4d7b3f44b9353..84bdbc7f9982d 100644
--- a/llvm/test/CodeGen/ARM/call-graph-section.ll
+++ b/llvm/test/CodeGen/ARM/call-graph-section.ll
@@ -22,16 +22,16 @@ entry:
;; Check that the numeric type id (md5 hash) for the below type ids are emitted
;; to the callgraph section.
-!0 = !{!"_ZTSFvE.generalized"}
+!0 = !{!"_ZTSFvE"}
!1 = !{!0}
-!2 = !{!"_ZTSFicE.generalized"}
+!2 = !{!"_ZTSFicE"}
!3 = !{!2}
!4 = !{!5}
-!5 = !{!"_ZTSFPvS_E.generalized"}
+!5 = !{!"_ZTSFPvS_"}
;; Make sure following type IDs are in call graph section
;; 0x5eecb3e2444f731f, 0x814b8e305486bc59, 0xf897fd777ade6814
; CHECK: Hex dump of section '.llvm.callgraph':
-; CHECK-NEXT: 0x00000000 00050000 00000000 00000000 00000324
-; CHECK-NEXT: 0x00000010 44f731f5 eecb3e54 86bc5981 4b8e307a
-; CHECK-NEXT: 0x00000020 de6814f8 97fd77
+; CHECK-NEXT: 0x00000000 00050000 00000000 00000000 000003e4
+; CHECK-NEXT: 0x00000010 2fa3e616 b06f5bc6 50144734 74f90127
+; CHECK-NEXT: 0x00000020 e7899bea af4387
diff --git a/llvm/test/CodeGen/X86/call-graph-section-addrtaken.ll b/llvm/test/CodeGen/X86/call-graph-section-addrtaken.ll
index 06daa8fa38810..0ac7931a745c0 100644
--- a/llvm/test/CodeGen/X86/call-graph-section-addrtaken.ll
+++ b/llvm/test/CodeGen/X86/call-graph-section-addrtaken.ll
@@ -22,9 +22,9 @@ entry:
ret void
}
-!0 = !{!"_ZTSFvPFviEE.generalized"}
-!1 = !{!"_ZTSFivE.generalized"}
-!2 = !{!"_ZTSFviE.generalized"}
+!0 = !{!"_ZTSFvPFviEE"}
+!1 = !{!"_ZTSFivE"}
+!2 = !{!"_ZTSFviE"}
; CHECK: .section .llvm.callgraph,"o", at llvm_call_graph,.text
;; Version
@@ -34,4 +34,4 @@ entry:
;; Function Entry PC
; CHECK-NEXT: .quad _ZL10myCallbacki
;; Function type ID
-; CHECK-NEXT: .quad -5212364466660467813
+; CHECK-NEXT: .quad -8738933900360652027
diff --git a/llvm/test/CodeGen/X86/call-graph-section-assembly.ll b/llvm/test/CodeGen/X86/call-graph-section-assembly.ll
index 38e2c9cbc3b47..05accb6788772 100644
--- a/llvm/test/CodeGen/X86/call-graph-section-assembly.ll
+++ b/llvm/test/CodeGen/X86/call-graph-section-assembly.ll
@@ -29,11 +29,11 @@ entry:
}
!0 = !{!1}
-!1 = !{!"_ZTSFvE.generalized"}
+!1 = !{!"_ZTSFvE"}
!2 = !{!3}
-!3 = !{!"_ZTSFicE.generalized"}
+!3 = !{!"_ZTSFicE"}
!4 = !{!5}
-!5 = !{!"_ZTSFPvS_E.generalized"}
+!5 = !{!"_ZTSFPvS_"}
; CHECK: .section .llvm.callgraph,"o", at llvm_call_graph,.text
;; Version
@@ -53,6 +53,6 @@ entry:
;; Number of unique indirect target type IDs.
; CHECK-NEXT: .byte 3
;; Indirect type IDs.
-; CHECK-NEXT: .quad 4524972987496481828
-; CHECK-NEXT: .quad 3498816979441845844
-; CHECK-NEXT: .quad 8646233951371320954
+; CHECK-NEXT: .quad 6588678392271548388
+; CHECK-NEXT: .quad 142272631118516422
+; CHECK-NEXT: .quad -8699916632982952153
diff --git a/llvm/test/CodeGen/X86/call-graph-section-tailcall.ll b/llvm/test/CodeGen/X86/call-graph-section-tailcall.ll
index 753995a9733bf..5e4e55c46ebcd 100644
--- a/llvm/test/CodeGen/X86/call-graph-section-tailcall.ll
+++ b/llvm/test/CodeGen/X86/call-graph-section-tailcall.ll
@@ -25,14 +25,14 @@ declare !callgraph !2 i32 @foo(i8 signext)
declare !callgraph !2 i32 @bar(i8 signext)
-!0 = !{!"_ZTSFiPvcE.generalized"}
+!0 = !{!"_ZTSFiPvcE"}
!1 = !{!2}
-!2 = !{!"_ZTSFicE.generalized"}
-!3 = !{!"_ZTSFiiE.generalized"}
+!2 = !{!"_ZTSFicE"}
+!3 = !{!"_ZTSFiiE"}
; CHECK: Hex dump of section '.llvm.callgraph':
-; CHECK-NEXT: 0x00000000 00050000 00000000 00008e19 0b7f3326
-; CHECK-NEXT: 0x00000010 e3000154 86bc5981 4b8e3000 05000000
-;; Verify that the type id 0x308e4b8159bc8654 is in section.
-; CHECK-NEXT: 0x00000020 00000000 00a150b8 3e0cfe3c b2015486
-; CHECK-NEXT: 0x00000030 bc59814b 8e30
+; CHECK-NEXT: 0x00000000 00050000 00000000 0000d4bf 88b60134
+; CHECK-NEXT: 0x00000010 63f001c6 50144734 74f90100 05000000
+;; Verify that the type id 0x144734744701c650 is in section.
+; CHECK-NEXT: 0x00000020 00000000 00423a34 855a01ce 4701c650
+; CHECK-NEXT: 0x00000030 14473474 f901
diff --git a/llvm/test/CodeGen/X86/call-graph-section.ll b/llvm/test/CodeGen/X86/call-graph-section.ll
index 2f08b0edc9ebf..db6fc1c6e3ca0 100644
--- a/llvm/test/CodeGen/X86/call-graph-section.ll
+++ b/llvm/test/CodeGen/X86/call-graph-section.ll
@@ -25,16 +25,16 @@ entry:
;; Check that the numeric type id (md5 hash) for the below type ids are emitted
;; to the callgraph section.
-!0 = !{!"_ZTSFvE.generalized"}
+!0 = !{!"_ZTSFvE"}
!1 = !{!0}
-!2 = !{!"_ZTSFicE.generalized"}
+!2 = !{!"_ZTSFicE"}
!3 = !{!2}
!4 = !{!5}
-!5 = !{!"_ZTSFPvS_E.generalized"}
+!5 = !{!"_ZTSFPvS_"}
;; Make sure following type IDs are in call graph section
;; 0x5eecb3e2444f731f, 0x814b8e305486bc59, 0xf897fd777ade6814
; CHECK: Hex dump of section '.llvm.callgraph':
; CHECK-NEXT: 0x00000000 00050000 00000000 00000000 00000000
-; CHECK-NEXT: 0x00000010 00000324 44f731f5 eecb3e54 86bc5981
-; CHECK-NEXT: 0x00000020 4b8e307a de6814f8 97fd77
+; CHECK-NEXT: 0x00000010 000003e4 2fa3e616 b06f5bc6 50144734
+; CHECK-NEXT: 0x00000020 74f90127 e7899bea af4387
diff --git a/llvm/test/Verifier/callee-type-metadata.ll b/llvm/test/Verifier/callee-type-metadata.ll
index e40d36ae0f234..43a12a11d92b4 100644
--- a/llvm/test/Verifier/callee-type-metadata.ll
+++ b/llvm/test/Verifier/callee-type-metadata.ll
@@ -1,7 +1,7 @@
;; Test if the callee_type metadata attached to indirect call sites adhere to the expected format.
; RUN: not llvm-as -disable-output < %s 2>&1 | FileCheck %s
-define i32 @_Z13call_indirectPFicEc(ptr %func, i8 signext %x) !type !0 {
+define i32 @_Z13call_indirectPFicEc(ptr %func, i8 signext %x) {
entry:
%func.addr = alloca ptr, align 8
%x.addr = alloca i8, align 1
@@ -13,17 +13,13 @@ entry:
%call = call i32 %fptr(i8 signext %x_val), !callee_type !0
; CHECK: The operand of callgraph metadata for functions must be an MDString
%call1 = call i32 %fptr(i8 signext %x_val), !callee_type !2
- ; CHECK: Well-formed generalized callgraph metadata must contain exactly one operand
+ ; CHECK: Well-formed callgraph metadata must contain exactly one operand
%call2 = call i32 %fptr(i8 signext %x_val), !callee_type !4
- ; CHECK: Only generalized callgraph metadata can be part of the callee_type metadata list
- %call3 = call i32 %fptr(i8 signext %x_val), !callee_type !6
ret i32 %call
}
-!0 = !{i64 0, !"_ZTSFiPvcE.generalized"}
+!0 = !{i64 0, !"_ZTSFiPvcE"}
!1 = !{!"_ZTSFicE"}
!2 = !{!2}
!3 = !{i64 1, !"_ZTSFicE"}
!4 = !{!3}
-!5 = !{!"_ZTSFicE"}
-!6 = !{!5}
More information about the cfe-commits
mailing list