[llvm] [LTO] Add function alias as function instead of data (PR #112599)
Shimin Cui via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 17 06:43:37 PDT 2024
https://github.com/scui-ibm updated https://github.com/llvm/llvm-project/pull/112599
>From 668284f98229d283c7b8c0eca90ee4b186e87442 Mon Sep 17 00:00:00 2001
From: Shimin Cui <scui at ca.ibm.com>
Date: Wed, 16 Oct 2024 11:27:54 -0400
Subject: [PATCH 1/2] [LTO] Add function alias as function instead of data
---
llvm/include/llvm/LTO/legacy/LTOModule.h | 2 +-
llvm/lib/LTO/LTOModule.cpp | 17 +++++++++++++----
2 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/llvm/include/llvm/LTO/legacy/LTOModule.h b/llvm/include/llvm/LTO/legacy/LTOModule.h
index 1b2de3b333855c..e861a56bcbac1d 100644
--- a/llvm/include/llvm/LTO/legacy/LTOModule.h
+++ b/llvm/include/llvm/LTO/legacy/LTOModule.h
@@ -195,7 +195,7 @@ struct LTOModule {
/// Add a function symbol as defined to the list.
void addDefinedFunctionSymbol(ModuleSymbolTable::Symbol Sym);
- void addDefinedFunctionSymbol(StringRef Name, const Function *F);
+ void addDefinedFunctionSymbol(StringRef Name, const GlobalValue *F);
/// Add a global symbol from module-level ASM to the defined list.
void addAsmGlobalSymbol(StringRef, lto_symbol_attributes scope);
diff --git a/llvm/lib/LTO/LTOModule.cpp b/llvm/lib/LTO/LTOModule.cpp
index eac78069f4d2bc..00eb8adb4e1035 100644
--- a/llvm/lib/LTO/LTOModule.cpp
+++ b/llvm/lib/LTO/LTOModule.cpp
@@ -406,11 +406,16 @@ void LTOModule::addDefinedFunctionSymbol(ModuleSymbolTable::Symbol Sym) {
Buffer.c_str();
}
- const Function *F = cast<Function>(cast<GlobalValue *>(Sym));
- addDefinedFunctionSymbol(Buffer, F);
+ auto *GV = cast<GlobalValue *>(Sym);
+ assert((isa<Function>(GV) ||
+ (isa<GlobalAlias>(GV) &&
+ isa<Function>(cast<GlobalAlias>(GV)->getAliasee()))) &&
+ "Not function or function alias");
+
+ addDefinedFunctionSymbol(Buffer, GV);
}
-void LTOModule::addDefinedFunctionSymbol(StringRef Name, const Function *F) {
+void LTOModule::addDefinedFunctionSymbol(StringRef Name, const GlobalValue *F) {
// add to list of defined symbols
addDefinedSymbol(Name, F, true);
}
@@ -611,7 +616,11 @@ void LTOModule::parseSymbols() {
}
assert(isa<GlobalAlias>(GV));
- addDefinedDataSymbol(Sym);
+
+ if (isa<Function>(cast<GlobalAlias>(GV)->getAliasee()))
+ addDefinedFunctionSymbol(Sym);
+ else
+ addDefinedDataSymbol(Sym);
}
// make symbols for all undefines
>From b3ad83937fcedfaf693331ab111219bfe5bf674a Mon Sep 17 00:00:00 2001
From: Shimin Cui <scui at ca.ibm.com>
Date: Thu, 17 Oct 2024 09:41:08 -0400
Subject: [PATCH 2/2] Add a test case with extended -list-symbols-only option
to print lto symbol attributes
---
llvm/test/LTO/PowerPC/list-symbol.ll | 16 +++++++
llvm/tools/llvm-lto/llvm-lto.cpp | 65 +++++++++++++++++++++++++++-
2 files changed, 79 insertions(+), 2 deletions(-)
create mode 100644 llvm/test/LTO/PowerPC/list-symbol.ll
diff --git a/llvm/test/LTO/PowerPC/list-symbol.ll b/llvm/test/LTO/PowerPC/list-symbol.ll
new file mode 100644
index 00000000000000..75300b11f7f188
--- /dev/null
+++ b/llvm/test/LTO/PowerPC/list-symbol.ll
@@ -0,0 +1,16 @@
+; RUN: llvm-as < %s > %t
+; RUN: llvm-lto -list-symbols-only %t | FileCheck %s
+; REQUIRES: default_triple
+
+; CHECK-DAG: v { data defined default }
+; CHECK-DAG: va { data defined default alias }
+; CHECK-DAG: f { function defined default }
+; CHECK-DAG: fa { function defined default alias }
+
+ at v = global i32 0
+ at va = alias i32, ptr @v
+ at fa = alias void (ptr), ptr @f
+
+define void @f() {
+ ret void
+}
diff --git a/llvm/tools/llvm-lto/llvm-lto.cpp b/llvm/tools/llvm-lto/llvm-lto.cpp
index f5076f0b975178..4090faf4e3fd95 100644
--- a/llvm/tools/llvm-lto/llvm-lto.cpp
+++ b/llvm/tools/llvm-lto/llvm-lto.cpp
@@ -407,6 +407,64 @@ static void printIndexStats() {
}
}
+/// Print the lto symbol attributes.
+static void printLTOSymbolAttributes(lto_symbol_attributes Attrs) {
+ outs() << "{ ";
+ unsigned Permission = Attrs & LTO_SYMBOL_PERMISSIONS_MASK;
+ switch (Permission) {
+ case LTO_SYMBOL_PERMISSIONS_CODE:
+ outs() << "function ";
+ break;
+ case LTO_SYMBOL_PERMISSIONS_DATA:
+ outs() << "data ";
+ break;
+ case LTO_SYMBOL_PERMISSIONS_RODATA:
+ outs() << "constant ";
+ break;
+ }
+ unsigned Definition = Attrs & LTO_SYMBOL_DEFINITION_MASK;
+ switch (Definition) {
+ case LTO_SYMBOL_DEFINITION_REGULAR:
+ outs() << "defined ";
+ break;
+ case LTO_SYMBOL_DEFINITION_TENTATIVE:
+ outs() << "common ";
+ break;
+ case LTO_SYMBOL_DEFINITION_WEAK:
+ outs() << "weak ";
+ break;
+ case LTO_SYMBOL_DEFINITION_UNDEFINED:
+ outs() << "extern ";
+ break;
+ case LTO_SYMBOL_DEFINITION_WEAKUNDEF:
+ outs() << "extern-weak ";
+ break;
+ }
+ unsigned Scope = Attrs & LTO_SYMBOL_SCOPE_MASK;
+ switch (Scope) {
+ case LTO_SYMBOL_SCOPE_INTERNAL:
+ outs() << "internal ";
+ break;
+ case LTO_SYMBOL_SCOPE_HIDDEN:
+ outs() << "hidden ";
+ break;
+ case LTO_SYMBOL_SCOPE_PROTECTED:
+ outs() << "protected ";
+ break;
+ case LTO_SYMBOL_SCOPE_DEFAULT:
+ outs() << "default ";
+ break;
+ case LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN:
+ outs() << "omitted ";
+ break;
+ }
+ if (Attrs & LTO_SYMBOL_COMDAT)
+ outs() << "comdat ";
+ if (Attrs & LTO_SYMBOL_ALIAS)
+ outs() << "alias ";
+ outs() << "}";
+}
+
/// Load each IR file and dump certain information based on active flags.
///
/// The main point here is to provide lit-testable coverage for the LTOModule
@@ -421,8 +479,11 @@ static void testLTOModule(const TargetOptions &Options) {
if (ListSymbolsOnly) {
// List the symbols.
outs() << Filename << ":\n";
- for (int I = 0, E = Module->getSymbolCount(); I != E; ++I)
- outs() << Module->getSymbolName(I) << "\n";
+ for (int I = 0, E = Module->getSymbolCount(); I != E; ++I) {
+ outs() << Module->getSymbolName(I) << " ";
+ printLTOSymbolAttributes(Module->getSymbolAttributes(I));
+ outs() << "\n";
+ }
}
if (QueryHasCtorDtor)
outs() << Filename
More information about the llvm-commits
mailing list