[clang] 5c3bde9 - [CodeGen] Fix an issue when the 'extern C' replacement names broke

Erich Keane via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 7 11:31:05 PDT 2022


Author: Erich Keane
Date: 2022-06-07T11:30:59-07:00
New Revision: 5c3bde96250c5260773009e691f92cb4823372df

URL: https://github.com/llvm/llvm-project/commit/5c3bde96250c5260773009e691f92cb4823372df
DIFF: https://github.com/llvm/llvm-project/commit/5c3bde96250c5260773009e691f92cb4823372df.diff

LOG: [CodeGen] Fix an issue when the 'extern C' replacement names broke

Originally broken by me in D122608, this is a regression where we
attempt to replace an extern-C thing with 'itself'.  The problem is that
we end up deleting it, causing the value to fail when it gets put into
llvm.used.

Added: 
    clang/test/CodeGenCXX/externc-used-not-replaced.cpp

Modified: 
    clang/lib/CodeGen/CodeGenModule.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index c3507fad0d79d..2760450ffcd2f 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -6388,6 +6388,10 @@ bool CodeGenModule::CheckAndReplaceExternCIFuncs(llvm::GlobalValue *Elem,
   // here.
   llvm::SmallVector<llvm::ConstantExpr *> CEs;
 
+  // It isn't valid to replace the extern-C ifuncs if all we find is itself!
+  if (Elem == CppFunc)
+    return false;
+
   // First make sure that all users of this are ifuncs (or ifuncs via a
   // bitcast), and collect the list of ifuncs and CEs so we can work on them
   // later.
@@ -6456,7 +6460,7 @@ void CodeGenModule::EmitStaticExternCAliases() {
 
     // If Val is null, that implies there were multiple declarations that each
     // had a claim to the unmangled name. In this case, generation of the alias
-    // is suppressed. See CodeGenModule::MaybeHandleStaticInExterC.
+    // is suppressed. See CodeGenModule::MaybeHandleStaticInExternC.
     if (!Val)
       break;
 

diff  --git a/clang/test/CodeGenCXX/externc-used-not-replaced.cpp b/clang/test/CodeGenCXX/externc-used-not-replaced.cpp
new file mode 100644
index 0000000000000..133b3a66c53f4
--- /dev/null
+++ b/clang/test/CodeGenCXX/externc-used-not-replaced.cpp
@@ -0,0 +1,8 @@
+// RUN: %clang_cc1 -triple x86_64-windows -emit-llvm -o - %s | FileCheck %s
+
+extern "C" {
+  const char a __attribute__((used)){};
+}
+
+// CHECK: @a = internal constant i8 0
+// CHECK: @llvm.used = appending global [1 x ptr] [ptr @a]


        


More information about the cfe-commits mailing list