[llvm] [CFI] Don't create alias->alias chains. (PR #225951)

Mircea Trofin via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 23 14:48:23 PDT 2026


https://github.com/mtrofin created https://github.com/llvm/llvm-project/pull/225951

Discovered downstream after PR #225173, when CFI and HWASAN are combined.

https://github.com/llvm/llvm-project/pull/225173#issuecomment-5802301926

>From 1cd334db7010e86927963ee53a8bdbf18488acab Mon Sep 17 00:00:00 2001
From: Mircea Trofin <mtrofin at google.com>
Date: Wed, 23 Sep 2026 14:42:12 -0700
Subject: [PATCH] [CFI] Don't create alias->alias chains.

---
 .../Transforms/IPO/ThinLTOBitcodeWriter.cpp   |  6 +++-
 .../Transforms/ThinLTOBitcodeWriter/comdat.ll |  4 +--
 .../split-internal-alias.ll                   | 32 +++++++++++++++++++
 3 files changed, 39 insertions(+), 3 deletions(-)
 create mode 100644 llvm/test/Transforms/ThinLTOBitcodeWriter/split-internal-alias.ll

diff --git a/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp b/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
index 51c28e352ff16c..d9ec0a51f942f8 100644
--- a/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
+++ b/llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
@@ -59,6 +59,10 @@ void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
       if (C->getName() == Name)
         RenamedComdats.try_emplace(C, ExportM.getOrInsertComdat(NewName));
 
+    Constant *Aliasee = &ExportGV;
+    while (auto *GA = dyn_cast<GlobalAlias>(Aliasee))
+      Aliasee = GA->getAliasee();
+
     // We must use the function's value type (FunctionType), not ptr - hence
     // ExportGV.getValueType() rather than getType(). Otherwise, when an
     // internal coroutine is imported into another module, IRMover sees a
@@ -70,7 +74,7 @@ void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
     // cleaner.
     auto *ExternalAlias = GlobalAlias::create(
         ExportGV.getValueType(), ExportGV.getAddressSpace(),
-        GlobalValue::ExternalLinkage, NewName, &ExportGV, &ExportM);
+        GlobalValue::ExternalLinkage, NewName, Aliasee, &ExportM);
     ExternalAlias->setVisibility(GlobalValue::HiddenVisibility);
     ExportGV.replaceUsesWithIf(
         ExternalAlias, [](Use &U) { return !isa<GlobalAlias>(U.getUser()); });
diff --git a/llvm/test/Transforms/ThinLTOBitcodeWriter/comdat.ll b/llvm/test/Transforms/ThinLTOBitcodeWriter/comdat.ll
index 1b02fa0ff505c8..4adbc34e798ce4 100644
--- a/llvm/test/Transforms/ThinLTOBitcodeWriter/comdat.ll
+++ b/llvm/test/Transforms/ThinLTOBitcodeWriter/comdat.ll
@@ -49,8 +49,8 @@ $nt = comdat any
 ; MERGED: @lwt = internal unnamed_addr alias [1 x ptr], ptr @lwt_aliasee
 ; MERGED: @nlwt_nl = internal unnamed_addr alias [1 x ptr], ptr @nlwt_aliasee
 ; MERGED: {{@"?lwt_nl\.[^ ]+}} = hidden alias i32, ptr @lwt_nl
-; MERGED: {{@"?lwt\.[^ ]+}} = hidden alias [1 x ptr], ptr @lwt
-; MERGED: {{@"?nlwt_nl\.[^ ]+}} = hidden alias [1 x ptr], ptr @nlwt_nl
+; MERGED: {{@"?lwt\.[^ ]+}} = hidden alias [1 x ptr], ptr @lwt_aliasee
+; MERGED: {{@"?nlwt_nl\.[^ ]+}} = hidden alias [1 x ptr], ptr @nlwt_aliasee
 
 ; THIN: {{@"?lwt\.[^ ]+}} = external hidden global [1 x ptr]
 @lwt = internal unnamed_addr alias [1 x ptr], ptr @lwt_aliasee
diff --git a/llvm/test/Transforms/ThinLTOBitcodeWriter/split-internal-alias.ll b/llvm/test/Transforms/ThinLTOBitcodeWriter/split-internal-alias.ll
new file mode 100644
index 00000000000000..16769513e4c649
--- /dev/null
+++ b/llvm/test/Transforms/ThinLTOBitcodeWriter/split-internal-alias.ll
@@ -0,0 +1,32 @@
+; REQUIRES: aarch64-registered-target
+; RUN: opt -thinlto-bc -thinlto-split-lto-unit -o %t %s
+; RUN: llvm-modextract -b -n 0 -o %t0 %t
+; RUN: llvm-modextract -b -n 1 -o %t1 %t
+; RUN: llvm-dis -o - %t0 | FileCheck --check-prefix=M0 %s
+; RUN: llvm-dis -o - %t1 | FileCheck --check-prefix=M1 %s
+; RUN: llvm-lto2 run %t -o %t.out \
+; RUN:   -r=%t,use_vtable,plx \
+; RUN:   -r=%t,vtable.69cc645c8be4ef4172cfb55c93f80acd,l \
+; RUN:   -r=%t,rtti_alias.69cc645c8be4ef4172cfb55c93f80acd,plx \
+; RUN:   -r=%t,rtti_alias.69cc645c8be4ef4172cfb55c93f80acd,l \
+; RUN:   -r=%t,vtable.69cc645c8be4ef4172cfb55c93f80acd,plx
+
+target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
+target triple = "aarch64-unknown-linux-gnu"
+
+; M0: @rtti_storage = private constant i8 1
+ at rtti_storage = private constant i8 1
+
+; M0: @rtti_alias = internal alias i8, ptr @rtti_storage
+; M0: @rtti_alias.69cc645c8be4ef4172cfb55c93f80acd = hidden alias i8, ptr @rtti_storage
+; M0-NOT: hidden alias i8, ptr @rtti_alias{{$}}
+ at rtti_alias = internal alias i8, ptr @rtti_storage
+
+; M1: @vtable = internal constant [1 x ptr] [ptr @rtti_alias.69cc645c8be4ef4172cfb55c93f80acd], !type !0
+ at vtable = internal constant [1 x ptr] [ptr @rtti_alias], !type !0
+
+define ptr @use_vtable() {
+  ret ptr @vtable
+}
+
+!0 = !{i64 0, !"_ZTS4Base"}



More information about the llvm-commits mailing list