[llvm] [NFC][ModuleUtils] Move externalize() from module splitting utilities (PR #221181)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 4 03:04:46 PDT 2026
https://github.com/mmjjpp updated https://github.com/llvm/llvm-project/pull/221181
>From 53ce8b2ca7d5f3879d916915e406e8ebf9878b23 Mon Sep 17 00:00:00 2001
From: maojiaping <maojiaping1 at huawei.com>
Date: Fri, 4 Sep 2026 16:26:53 +0800
Subject: [PATCH 1/2] [NFC][ModuleUtils] Move externalize() from module
splitting utilities
SplitModule.cpp and AMDGPUSplitModule.cpp each carry an identical
static externalize() helper. Move it to ModuleUtils as
llvm::externalize so existing and future module splitting utilities
can share a single implementation.
---
.../llvm/Transforms/Utils/ModuleUtils.h | 8 +++++++
llvm/lib/Target/AMDGPU/AMDGPUSplitModule.cpp | 14 +------------
llvm/lib/Transforms/Utils/ModuleUtils.cpp | 12 +++++++++++
llvm/lib/Transforms/Utils/SplitModule.cpp | 21 +++++--------------
4 files changed, 26 insertions(+), 29 deletions(-)
diff --git a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
index baafc078039ec..09eafbd0389cb 100644
--- a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
+++ b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
@@ -136,6 +136,14 @@ filterDeadComdatFunctions(SmallVectorImpl<Function *> &DeadComdatFunctions);
/// unique identifier for this module, so we return the empty string.
LLVM_ABI std::string getUniqueModuleId(Module *M);
+/// If \p GV has local linkage, promote it to external + hidden visibility so
+/// it can be referenced across module partitions. Unnamed entities are given
+/// a stable name so they are named consistently across partitions.
+///
+/// Used by module splitting utilities (SplitModule, AMDGPUSplitModule, ...)
+/// to prepare a module for partitioning.
+LLVM_ABI void externalize(GlobalValue &GV);
+
/// Embed the memory buffer \p Buf into the module \p M as a global using the
/// specified section name. Also provide a metadata entry to identify it in the
/// module using the same section name. If \p SectionExclude is true !exclude
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUSplitModule.cpp b/llvm/lib/Target/AMDGPU/AMDGPUSplitModule.cpp
index 05857d88a597c..80e246ac8eed2 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUSplitModule.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUSplitModule.cpp
@@ -56,6 +56,7 @@
#include "llvm/Support/Timer.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/Cloning.h"
+#include "llvm/Transforms/Utils/ModuleUtils.h"
#include <cassert>
#include <cmath>
#include <utility>
@@ -164,19 +165,6 @@ static bool isNonCopyable(const Function &F) {
AMDGPU::isEntryFunctionCC(F.getCallingConv());
}
-/// If \p GV has local linkage, make it external + hidden.
-static void externalize(GlobalValue &GV) {
- if (GV.hasLocalLinkage()) {
- GV.setLinkage(GlobalValue::ExternalLinkage);
- GV.setVisibility(GlobalValue::HiddenVisibility);
- }
-
- // Unnamed entities must be named consistently between modules. setName will
- // give a distinct name to each such entity.
- if (!GV.hasName())
- GV.setName("__llvmsplit_unnamed");
-}
-
/// Cost analysis function. Calculates the cost of each function in \p M
///
/// \param GetTTI Abstract getter for TargetTransformInfo.
diff --git a/llvm/lib/Transforms/Utils/ModuleUtils.cpp b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
index 71e9c70cbf9a5..98f60873bdb7c 100644
--- a/llvm/lib/Transforms/Utils/ModuleUtils.cpp
+++ b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
@@ -381,6 +381,18 @@ std::string llvm::getUniqueModuleId(Module *M) {
return ("." + Str).str();
}
+void llvm::externalize(GlobalValue &GV) {
+ if (GV.hasLocalLinkage()) {
+ GV.setLinkage(GlobalValue::ExternalLinkage);
+ GV.setVisibility(GlobalValue::HiddenVisibility);
+ }
+
+ // Unnamed entities must be named consistently between modules. setName will
+ // give a distinct name to each such entity.
+ if (!GV.hasName())
+ GV.setName("__llvmsplit_unnamed");
+}
+
GlobalVariable *llvm::embedBufferInModule(Module &M, MemoryBufferRef Buf,
StringRef SectionName,
Align Alignment,
diff --git a/llvm/lib/Transforms/Utils/SplitModule.cpp b/llvm/lib/Transforms/Utils/SplitModule.cpp
index 8e70902c4dac2..5ae3c6922e609 100644
--- a/llvm/lib/Transforms/Utils/SplitModule.cpp
+++ b/llvm/lib/Transforms/Utils/SplitModule.cpp
@@ -36,6 +36,7 @@
#include "llvm/Support/MD5.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Utils/Cloning.h"
+#include "llvm/Transforms/Utils/ModuleUtils.h"
#include "llvm/Transforms/Utils/ValueMapper.h"
#include <cassert>
#include <iterator>
@@ -203,18 +204,6 @@ static void findPartitions(Module &M, ClusterIDMapType &ClusterIDMap,
}
}
-static void externalize(GlobalValue *GV) {
- if (GV->hasLocalLinkage()) {
- GV->setLinkage(GlobalValue::ExternalLinkage);
- GV->setVisibility(GlobalValue::HiddenVisibility);
- }
-
- // Unnamed entities must be named consistently between modules. setName will
- // give a distinct name to each such entity.
- if (!GV->hasName())
- GV->setName("__llvmsplit_unnamed");
-}
-
// Returns whether GV should be in partition (0-based) I of N.
static bool isInPartition(const GlobalValue *GV, unsigned I, unsigned N) {
if (const GlobalObject *Root = getGVPartitioningRoot(GV))
@@ -242,13 +231,13 @@ void llvm::SplitModule(
bool PreserveLocals, bool RoundRobin) {
if (!PreserveLocals) {
for (Function &F : M)
- externalize(&F);
+ externalize(F);
for (GlobalVariable &GV : M.globals())
- externalize(&GV);
+ externalize(GV);
for (GlobalAlias &GA : M.aliases())
- externalize(&GA);
+ externalize(GA);
for (GlobalIFunc &GIF : M.ifuncs())
- externalize(&GIF);
+ externalize(GIF);
}
// This performs splitting without a need for externalization, which might not
>From 987c41169d31dd03a333d6c5221206d1bc45dc54 Mon Sep 17 00:00:00 2001
From: maojiaping <maojiaping1 at huawei.com>
Date: Fri, 4 Sep 2026 17:35:39 +0800
Subject: [PATCH 2/2] [NFC][ModuleUtils] Rename externalize to
externalizeGlobal
---
llvm/include/llvm/Transforms/Utils/ModuleUtils.h | 2 +-
llvm/lib/Target/AMDGPU/AMDGPUSplitModule.cpp | 6 +++---
llvm/lib/Transforms/Utils/ModuleUtils.cpp | 2 +-
llvm/lib/Transforms/Utils/SplitModule.cpp | 8 ++++----
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
index 09eafbd0389cb..5be166b7b92b9 100644
--- a/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
+++ b/llvm/include/llvm/Transforms/Utils/ModuleUtils.h
@@ -142,7 +142,7 @@ LLVM_ABI std::string getUniqueModuleId(Module *M);
///
/// Used by module splitting utilities (SplitModule, AMDGPUSplitModule, ...)
/// to prepare a module for partitioning.
-LLVM_ABI void externalize(GlobalValue &GV);
+LLVM_ABI void externalizeGlobal(GlobalValue &GV);
/// Embed the memory buffer \p Buf into the module \p M as a global using the
/// specified section name. Also provide a metadata entry to identify it in the
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUSplitModule.cpp b/llvm/lib/Target/AMDGPU/AMDGPUSplitModule.cpp
index 80e246ac8eed2..71b74b00a9a33 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUSplitModule.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUSplitModule.cpp
@@ -1385,7 +1385,7 @@ static void splitAMDGPUModule(
if (Fn.hasLocalLinkage() && Fn.hasAddressTaken()) {
LLVM_DEBUG(dbgs() << "[externalize] "; Fn.printAsOperand(dbgs());
dbgs() << " because its address is taken\n");
- externalize(Fn);
+ externalizeGlobal(Fn);
}
}
}
@@ -1396,14 +1396,14 @@ static void splitAMDGPUModule(
for (auto &GV : M.globals()) {
if (GV.hasLocalLinkage())
LLVM_DEBUG(dbgs() << "[externalize] GV " << GV.getName() << '\n');
- externalize(GV);
+ externalizeGlobal(GV);
}
}
for (auto &GA : M.aliases()) {
if (GA.hasLocalLinkage()) {
LLVM_DEBUG(dbgs() << "[externalize] alias " << GA.getName() << '\n');
- externalize(GA);
+ externalizeGlobal(GA);
}
}
diff --git a/llvm/lib/Transforms/Utils/ModuleUtils.cpp b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
index 98f60873bdb7c..61d601f8b6aa9 100644
--- a/llvm/lib/Transforms/Utils/ModuleUtils.cpp
+++ b/llvm/lib/Transforms/Utils/ModuleUtils.cpp
@@ -381,7 +381,7 @@ std::string llvm::getUniqueModuleId(Module *M) {
return ("." + Str).str();
}
-void llvm::externalize(GlobalValue &GV) {
+void llvm::externalizeGlobal(GlobalValue &GV) {
if (GV.hasLocalLinkage()) {
GV.setLinkage(GlobalValue::ExternalLinkage);
GV.setVisibility(GlobalValue::HiddenVisibility);
diff --git a/llvm/lib/Transforms/Utils/SplitModule.cpp b/llvm/lib/Transforms/Utils/SplitModule.cpp
index 5ae3c6922e609..7c34421fd722a 100644
--- a/llvm/lib/Transforms/Utils/SplitModule.cpp
+++ b/llvm/lib/Transforms/Utils/SplitModule.cpp
@@ -231,13 +231,13 @@ void llvm::SplitModule(
bool PreserveLocals, bool RoundRobin) {
if (!PreserveLocals) {
for (Function &F : M)
- externalize(F);
+ externalizeGlobal(F);
for (GlobalVariable &GV : M.globals())
- externalize(GV);
+ externalizeGlobal(GV);
for (GlobalAlias &GA : M.aliases())
- externalize(GA);
+ externalizeGlobal(GA);
for (GlobalIFunc &GIF : M.ifuncs())
- externalize(GIF);
+ externalizeGlobal(GIF);
}
// This performs splitting without a need for externalization, which might not
More information about the llvm-commits
mailing list