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]] = !{!"[email protected]"}
+// MS: [[F_TVOID]] = !{!"?6AX@Z"}
 // MS: [[F_TVOID_CT]] = !{[[F_TVOID:![0-9]+]]}
-// MS: [[F_TPRIMITIVE]] = !{!"[email protected]"}
-// MS: [[F_TPTR]] = !{!"[email protected]"}
+// MS: [[F_TPRIMITIVE]] = !{!"?6AHDMN@Z"}
+// MS: [[F_TPTR]] = !{!"?6APEAHPEADPEAMPEAN@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",@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",@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}


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to