[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:05:00 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/3] 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/3] 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/3] 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);
   }
 }
 



More information about the cfe-commits mailing list