[clang] [clang][Driver] Honor integer normalization with -fexperimental-call-graph-section (PR #230731)

via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 21 16:55:15 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Prabhu Rajasekaran (Prabhuk)

<details>
<summary>Changes</summary>

The type identifiers emitted for the call graph section honor
-fsanitize-cfi-icall-experimental-normalize-integers in CodeGen
(CreateMetadataIdentifierForCallGraphType), but the driver only
forwarded the option to cc1 when -fsanitize=cfi or -fsanitize=kcfi was
enabled, and otherwise reported it as unused. Forward it when
-fexperimental-call-graph-section is enabled as well.

Integer normalization is what allows LLVM CFI type identifiers to match
across languages: Rust, for example, always encodes integers by their
width and signedness, so cross-language CFI with Rust requires
-fsanitize-cfi-icall-experimental-normalize-integers on the C/C++ side.
Honoring the option for the call graph section without a sanitizer makes
it possible to emit call graph type identifiers for C/C++ code that other
front ends using the normalized encoding could match, should they emit
the call graph section as well.

Assisted-by: Claude


---
Full diff: https://github.com/llvm/llvm-project/pull/230731.diff


2 Files Affected:

- (modified) clang/lib/Driver/SanitizerArgs.cpp (+14-3) 
- (modified) clang/test/Driver/call-graph-section.c (+10) 


``````````diff
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index a1bfa90e5dceb..4da96662b8909 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -1003,6 +1003,14 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
                      options::OPT_fno_sanitize_cfi_canonical_jump_tables, true);
   }
 
+  // The call graph section (-fexperimental-call-graph-section) encodes the
+  // type identifiers of indirect calls and their potential targets like CFI
+  // does, so integer normalization applies to it as well, with or without CFI.
+  if (Args.hasFlag(options::OPT_fexperimental_call_graph_section,
+                   options::OPT_fno_experimental_call_graph_section, false))
+    CfiICallNormalizeIntegers |=
+        Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
+
   if (AllAddedKinds & SanitizerKind::KCFI) {
     CfiICallGeneralizePointers =
         Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
@@ -1537,6 +1545,12 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
     addIncludeLinkerOption(TC, Args, CmdArgs, "__sanitizer_stats_register");
   }
 
+  // Integer normalization also applies to the type identifiers of the call
+  // graph section (-fexperimental-call-graph-section), which does not require
+  // any sanitizer to be enabled.
+  if (CfiICallNormalizeIntegers)
+    CmdArgs.push_back("-fsanitize-cfi-icall-experimental-normalize-integers");
+
   if (Sanitizers.empty())
     return;
   CmdArgs.push_back(Args.MakeArgString("-fsanitize=" + toString(Sanitizers)));
@@ -1615,9 +1629,6 @@ void SanitizerArgs::addArgs(const ToolChain &TC, const llvm::opt::ArgList &Args,
   if (CfiICallGeneralizePointers)
     CmdArgs.push_back("-fsanitize-cfi-icall-generalize-pointers");
 
-  if (CfiICallNormalizeIntegers)
-    CmdArgs.push_back("-fsanitize-cfi-icall-experimental-normalize-integers");
-
   if (KcfiArity) {
     if (!TC.getTriple().isOSLinux() || !TC.getTriple().isArch64Bit()) {
       TC.getDriver().Diag(clang::diag::err_drv_kcfi_arity_unsupported_target)
diff --git a/clang/test/Driver/call-graph-section.c b/clang/test/Driver/call-graph-section.c
index 00fa896dffb87..a3996088af32a 100644
--- a/clang/test/Driver/call-graph-section.c
+++ b/clang/test/Driver/call-graph-section.c
@@ -3,3 +3,13 @@
 
 // CALL-GRAPH-SECTION: "-fexperimental-call-graph-section"
 // NO-CALL-GRAPH-SECTION-NOT: "-fexperimental-call-graph-section"
+
+// The call graph section type identifiers honor integer normalization like CFI
+// does, so the option is forwarded even when no sanitizer is enabled.
+// RUN: %clang -### -fexperimental-call-graph-section -fsanitize-cfi-icall-experimental-normalize-integers %s 2>&1 | FileCheck --check-prefix=NORMALIZE-INTEGERS %s
+// RUN: %clang -### -fsanitize-cfi-icall-experimental-normalize-integers %s 2>&1 | FileCheck --check-prefix=NO-NORMALIZE-INTEGERS %s
+
+// NORMALIZE-INTEGERS-NOT: warning: argument unused during compilation
+// NORMALIZE-INTEGERS: "-fexperimental-call-graph-section"
+// NORMALIZE-INTEGERS-SAME: "-fsanitize-cfi-icall-experimental-normalize-integers"
+// NO-NORMALIZE-INTEGERS-NOT: "-fsanitize-cfi-icall-experimental-normalize-integers"

``````````

</details>


https://github.com/llvm/llvm-project/pull/230731


More information about the cfe-commits mailing list