[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