[clang] [BPF] Handle aliases in CodeGenModule::EmitExternalDeclaration. Fixes #192365 (PR #192374)
Alexander Kornienko via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 17 18:18:12 PDT 2026
https://github.com/alexfh updated https://github.com/llvm/llvm-project/pull/192374
>From 92df05977d836bd82b3bef6c554daccfd20483d0 Mon Sep 17 00:00:00 2001
From: Alexander Kornienko <alexfh at google.com>
Date: Thu, 16 Apr 2026 02:02:48 +0000
Subject: [PATCH 1/4] Handle aliases in CodeGenModule::EmitExternalDeclaration.
Fixes #192365
---
clang/lib/CodeGen/CodeGenModule.cpp | 19 ++++++++++++++-----
.../test/CodeGenCXX/bpf-debug-info-alias.cpp | 9 +++++++++
2 files changed, 23 insertions(+), 5 deletions(-)
create mode 100644 clang/test/CodeGenCXX/bpf-debug-info-alias.cpp
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 79c98f82a766f..2df1b1dd0d089 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -5990,12 +5990,21 @@ void CodeGenModule::EmitExternalDeclaration(const DeclaratorDecl *D) {
llvm::Constant *Addr = GetAddrOfGlobal(GD)->stripPointerCasts();
if (const auto *VD = dyn_cast<VarDecl>(D)) {
- DI->EmitExternalVariable(
- cast<llvm::GlobalVariable>(Addr->stripPointerCasts()), VD);
+ if (auto *GV = dyn_cast<llvm::GlobalVariable>(Addr))
+ DI->EmitExternalVariable(GV, VD);
+ else if (auto *GA = dyn_cast<llvm::GlobalAlias>(Addr))
+ DI->EmitGlobalAlias(GA, GD);
+ else
+ llvm_unreachable("Unexpected address for external variable");
} else if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
- llvm::Function *Fn = cast<llvm::Function>(Addr);
- if (!Fn->getSubprogram())
- DI->EmitFunctionDecl(GD, FD->getLocation(), FD->getType(), Fn);
+ if (auto *Fn = dyn_cast<llvm::Function>(Addr)) {
+ if (!Fn->getSubprogram())
+ DI->EmitFunctionDecl(GD, FD->getLocation(), FD->getType(), Fn);
+ } else if (auto *GA = dyn_cast<llvm::GlobalAlias>(Addr)) {
+ DI->EmitGlobalAlias(GA, GD);
+ } else {
+ llvm_unreachable("Unexpected address for external function");
+ }
}
}
diff --git a/clang/test/CodeGenCXX/bpf-debug-info-alias.cpp b/clang/test/CodeGenCXX/bpf-debug-info-alias.cpp
new file mode 100644
index 0000000000000..e5e1709990905
--- /dev/null
+++ b/clang/test/CodeGenCXX/bpf-debug-info-alias.cpp
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -triple bpfel -emit-llvm -debug-info-kind=constructor %s -o - | FileCheck %s
+
+// CHECK: @_Z9__cat_op0v = alias void (), ptr @e
+// CHECK: !DIImportedEntity(tag: DW_TAG_imported_declaration, name: "__cat_op0", {{.*}} entity: ![[ENTITY:[0-9]+]]
+// CHECK: ![[ENTITY]] = !DISubprogram(name: "__cat_op0", linkageName: "_Z9__cat_op0v"
+
+extern "C" void e() {}
+void __attribute__((alias("e"))) __cat_op0();
+void r() { __cat_op0(); }
>From bf8e82f91c856997e26fea3610a44fcda1deff01 Mon Sep 17 00:00:00 2001
From: Alexander Kornienko <alexfh at google.com>
Date: Sat, 18 Apr 2026 00:44:49 +0000
Subject: [PATCH 2/4] Add a test for global variable aliases. Move common code
out of the branches.
---
clang/lib/CodeGen/CodeGenModule.cpp | 8 ++++----
clang/test/CodeGenCXX/bpf-debug-info-alias.cpp | 11 +++++++++--
2 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 2df1b1dd0d089..e4aa783421905 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -5989,19 +5989,19 @@ void CodeGenModule::EmitExternalDeclaration(const DeclaratorDecl *D) {
return;
llvm::Constant *Addr = GetAddrOfGlobal(GD)->stripPointerCasts();
+ if (auto *GA = dyn_cast<llvm::GlobalAlias>(Addr)) {
+ DI->EmitGlobalAlias(GA, GD);
+ return;
+ }
if (const auto *VD = dyn_cast<VarDecl>(D)) {
if (auto *GV = dyn_cast<llvm::GlobalVariable>(Addr))
DI->EmitExternalVariable(GV, VD);
- else if (auto *GA = dyn_cast<llvm::GlobalAlias>(Addr))
- DI->EmitGlobalAlias(GA, GD);
else
llvm_unreachable("Unexpected address for external variable");
} else if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
if (auto *Fn = dyn_cast<llvm::Function>(Addr)) {
if (!Fn->getSubprogram())
DI->EmitFunctionDecl(GD, FD->getLocation(), FD->getType(), Fn);
- } else if (auto *GA = dyn_cast<llvm::GlobalAlias>(Addr)) {
- DI->EmitGlobalAlias(GA, GD);
} else {
llvm_unreachable("Unexpected address for external function");
}
diff --git a/clang/test/CodeGenCXX/bpf-debug-info-alias.cpp b/clang/test/CodeGenCXX/bpf-debug-info-alias.cpp
index e5e1709990905..66d64c37ae806 100644
--- a/clang/test/CodeGenCXX/bpf-debug-info-alias.cpp
+++ b/clang/test/CodeGenCXX/bpf-debug-info-alias.cpp
@@ -1,9 +1,16 @@
// RUN: %clang_cc1 -triple bpfel -emit-llvm -debug-info-kind=constructor %s -o - | FileCheck %s
// CHECK: @_Z9__cat_op0v = alias void (), ptr @e
-// CHECK: !DIImportedEntity(tag: DW_TAG_imported_declaration, name: "__cat_op0", {{.*}} entity: ![[ENTITY:[0-9]+]]
-// CHECK: ![[ENTITY]] = !DISubprogram(name: "__cat_op0", linkageName: "_Z9__cat_op0v"
+// CHECK: @alias_var = alias i32, ptr @global_var
+// CHECK-DAG: !DIImportedEntity(tag: DW_TAG_imported_declaration, name: "__cat_op0", {{.*}} entity: ![[ENTITY:[0-9]+]]
+// CHECK-DAG: ![[ENTITY]] = {{.*}}!DISubprogram(name: "__cat_op0", linkageName: "_Z9__cat_op0v"
+// CHECK-DAG: !DIImportedEntity(tag: DW_TAG_imported_declaration, name: "alias_var", {{.*}} entity: ![[ENTITY2:[0-9]+]]
+// CHECK-DAG: ![[ENTITY2]] = {{.*}}!DIGlobalVariable(name: "global_var", {{.*}}
extern "C" void e() {}
void __attribute__((alias("e"))) __cat_op0();
void r() { __cat_op0(); }
+
+int global_var;
+extern "C" int alias_var __attribute__((alias("global_var")));
+int use_alias() { return alias_var; }
>From c42d400e44049bb7ab88e52fb3c21fe59c272437 Mon Sep 17 00:00:00 2001
From: Alexander Kornienko <alexfh at google.com>
Date: Sat, 18 Apr 2026 01:04:27 +0000
Subject: [PATCH 3/4] Simplify the code a bit, return back cast<>
---
clang/lib/CodeGen/CodeGenModule.cpp | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index e4aa783421905..4b96dca68da96 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -5994,17 +5994,12 @@ void CodeGenModule::EmitExternalDeclaration(const DeclaratorDecl *D) {
return;
}
if (const auto *VD = dyn_cast<VarDecl>(D)) {
- if (auto *GV = dyn_cast<llvm::GlobalVariable>(Addr))
- DI->EmitExternalVariable(GV, VD);
- else
- llvm_unreachable("Unexpected address for external variable");
+ DI->EmitExternalVariable(
+ cast<llvm::GlobalVariable>(Addr->stripPointerCasts()), VD);
} else if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
- if (auto *Fn = dyn_cast<llvm::Function>(Addr)) {
- if (!Fn->getSubprogram())
- DI->EmitFunctionDecl(GD, FD->getLocation(), FD->getType(), Fn);
- } else {
- llvm_unreachable("Unexpected address for external function");
- }
+ llvm::Function *Fn = cast<llvm::Function>(Addr);
+ if (!Fn->getSubprogram())
+ DI->EmitFunctionDecl(GD, FD->getLocation(), FD->getType(), Fn);
}
}
>From 0dbad44e62b3607eeaa206c07388d2f0f4b5b748 Mon Sep 17 00:00:00 2001
From: Alexander Kornienko <alexfh at google.com>
Date: Sat, 18 Apr 2026 01:17:57 +0000
Subject: [PATCH 4/4] Fix formatting
---
clang/lib/CodeGen/CodeGenModule.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 4b96dca68da96..c635a6c175b25 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -5990,8 +5990,8 @@ void CodeGenModule::EmitExternalDeclaration(const DeclaratorDecl *D) {
llvm::Constant *Addr = GetAddrOfGlobal(GD)->stripPointerCasts();
if (auto *GA = dyn_cast<llvm::GlobalAlias>(Addr)) {
- DI->EmitGlobalAlias(GA, GD);
- return;
+ DI->EmitGlobalAlias(GA, GD);
+ return;
}
if (const auto *VD = dyn_cast<VarDecl>(D)) {
DI->EmitExternalVariable(
More information about the cfe-commits
mailing list