[clang] 88b7e06 - Revert "[clang][CodeGen] Emit annotations for function declarations."

Benjamin Kramer via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 13 04:27:04 PDT 2023


Author: Benjamin Kramer
Date: 2023-09-13T13:22:57+02:00
New Revision: 88b7e06dcf9723d0869b0c6bee030b4140e4366d

URL: https://github.com/llvm/llvm-project/commit/88b7e06dcf9723d0869b0c6bee030b4140e4366d
DIFF: https://github.com/llvm/llvm-project/commit/88b7e06dcf9723d0869b0c6bee030b4140e4366d.diff

LOG: Revert "[clang][CodeGen] Emit annotations for function declarations."

This reverts commit c6a33ff49dfb3498dae15c718820ea3d9c19f3cb. Makes
clang segfault.

// clang t.cc
class a;
class c {
 public:
  [[clang::annotate("")]] c(const c *) {}
};
class d {
  d(const c *, a *, a *);
  c e;
};
d::d(const c *f, a *, a *) : e(f) {}

Added: 
    

Modified: 
    clang/lib/CodeGen/CodeGenModule.cpp
    clang/lib/CodeGen/CodeGenModule.h
    clang/test/CodeGen/annotations-global.c
    clang/test/CodeGenCXX/attr-annotate.cpp

Removed: 
    clang/test/CodeGen/annotations-decl-use-decl.c
    clang/test/CodeGen/annotations-decl-use-define.c
    clang/test/CodeGen/annotations-declaration.c
    clang/test/CodeGenCXX/attr-annotate-destructor.cpp


################################################################################
diff  --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 0ee9c4a9e0be4c9..8b0c9340775cbe9 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -697,7 +697,6 @@ void CodeGenModule::checkAliases() {
 void CodeGenModule::clear() {
   DeferredDeclsToEmit.clear();
   EmittedDeferredDecls.clear();
-  DeferredAnnotations.clear();
   if (OpenMPRuntime)
     OpenMPRuntime->clear();
 }
@@ -3094,10 +3093,6 @@ void CodeGenModule::EmitVTablesOpportunistically() {
 }
 
 void CodeGenModule::EmitGlobalAnnotations() {
-  for (const auto& [MangledName, VD] : DeferredAnnotations)
-    AddGlobalAnnotations(VD, GetGlobalValue(MangledName));
-  DeferredAnnotations.clear();
-
   if (Annotations.empty())
     return;
 
@@ -3602,14 +3597,6 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) {
 
   // Ignore declarations, they will be emitted on their first use.
   if (const auto *FD = dyn_cast<FunctionDecl>(Global)) {
-    // Update deferred annotations with the latest declaration if the function
-    // function was already used or defined.
-    if (FD->hasAttr<AnnotateAttr>()) {
-      StringRef MangledName = getMangledName(GD);
-      if (GetGlobalValue(MangledName))
-        DeferredAnnotations[MangledName] = FD;
-    }
-
     // Forward declarations are emitted lazily on first use.
     if (!FD->doesThisDeclarationHaveABody()) {
       if (!FD->doesDeclarationForceExternallyVisibleDefinition())
@@ -4383,11 +4370,6 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
       llvm::Function::Create(FTy, llvm::Function::ExternalLinkage,
                              Entry ? StringRef() : MangledName, &getModule());
 
-  // Store the declaration associated with this function so it is potentially
-  // updated by further declarations or definitions and emitted at the end.
-  if (D && D->hasAttr<AnnotateAttr>())
-    DeferredAnnotations[MangledName] = cast<ValueDecl>(D);
-
   // If we already created a function with the same mangled name (but 
diff erent
   // type) before, take its name and add it to the list of functions to be
   // replaced with F at the end of CodeGen.
@@ -5682,6 +5664,8 @@ void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD,
     AddGlobalCtor(Fn, CA->getPriority());
   if (const DestructorAttr *DA = D->getAttr<DestructorAttr>())
     AddGlobalDtor(Fn, DA->getPriority(), true);
+  if (D->hasAttr<AnnotateAttr>())
+    AddGlobalAnnotations(D, Fn);
   if (getLangOpts().OpenMP && D->hasAttr<OMPDeclareTargetDeclAttr>())
     getOpenMPRuntime().emitDeclareTargetFunction(D, GV);
 }

diff  --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h
index 8b0d68afbd0ecd2..073b471c6e3cc11 100644
--- a/clang/lib/CodeGen/CodeGenModule.h
+++ b/clang/lib/CodeGen/CodeGenModule.h
@@ -431,10 +431,6 @@ class CodeGenModule : public CodeGenTypeCache {
   /// Global annotations.
   std::vector<llvm::Constant*> Annotations;
 
-  // Store deferred function annotations so they can be emitted at the end with
-  // most up to date ValueDecl that will have all the inherited annotations.
-  llvm::DenseMap<StringRef, const ValueDecl *> DeferredAnnotations;
-
   /// Map used to get unique annotation strings.
   llvm::StringMap<llvm::Constant*> AnnotationStrings;
 

diff  --git a/clang/test/CodeGen/annotations-decl-use-decl.c b/clang/test/CodeGen/annotations-decl-use-decl.c
deleted file mode 100644
index f43ba91a34d876f..000000000000000
--- a/clang/test/CodeGen/annotations-decl-use-decl.c
+++ /dev/null
@@ -1,16 +0,0 @@
-// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
-
-// Test annotation attributes are still emitted when the function is used before
-// it is defined with annotations.
-
-void foo(void);
-void *xxx = (void*)foo;
-void __attribute__((annotate("bar"))) foo();
-
-// CHECK: target triple
-// CHECK-DAG: private unnamed_addr constant [4 x i8] c"bar\00", section "llvm.metadata"
-
-// CHECK: @llvm.global.annotations = appending global [1 x { ptr, ptr, ptr, i32, ptr }] [{
-// CHECK-SAME: { ptr @foo,
-// CHECK-SAME: }], section "llvm.metadata"
-

diff  --git a/clang/test/CodeGen/annotations-decl-use-define.c b/clang/test/CodeGen/annotations-decl-use-define.c
deleted file mode 100644
index 1ca12cddd3658db..000000000000000
--- a/clang/test/CodeGen/annotations-decl-use-define.c
+++ /dev/null
@@ -1,16 +0,0 @@
-// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
-
-// Test annotation attributes are still emitted when the function is used before
-// it is defined with annotations.
-
-void foo(void);
-void *xxx = (void*)foo;
-void __attribute__((annotate("bar"))) foo() {}
-
-// CHECK: target triple
-// CHECK-DAG: private unnamed_addr constant [4 x i8] c"bar\00", section "llvm.metadata"
-
-// CHECK: @llvm.global.annotations = appending global [1 x { ptr, ptr, ptr, i32, ptr }] [{
-// CHECK-SAME: { ptr @foo,
-// CHECK-SAME: }], section "llvm.metadata"
-

diff  --git a/clang/test/CodeGen/annotations-declaration.c b/clang/test/CodeGen/annotations-declaration.c
deleted file mode 100644
index 2076f4dc030ae5f..000000000000000
--- a/clang/test/CodeGen/annotations-declaration.c
+++ /dev/null
@@ -1,17 +0,0 @@
-// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s
-
-// Test annotation attributes are emitted for declarations.
-
-__attribute__((annotate("bar"))) int foo();
-
-int main() {
-  return foo();
-}
-
-// CHECK: target triple
-// CHECK-DAG: private unnamed_addr constant [4 x i8] c"bar\00", section "llvm.metadata"
-
-// CHECK: @llvm.global.annotations = appending global [1 x { ptr, ptr, ptr, i32, ptr }] [{
-// CHECK-SAME: { ptr @foo,
-// CHECK-SAME: }], section "llvm.metadata"
-

diff  --git a/clang/test/CodeGen/annotations-global.c b/clang/test/CodeGen/annotations-global.c
index 1ae80ef49acd759..d6e6f7de8a954f2 100644
--- a/clang/test/CodeGen/annotations-global.c
+++ b/clang/test/CodeGen/annotations-global.c
@@ -33,15 +33,15 @@ __attribute((address_space(1))) __attribute__((annotate("addrspace1_ann"))) char
 // CHECK: @llvm.global.annotations = appending global [11 x { ptr, ptr, ptr, i32, ptr }] [{
 // CHECK-SAME: { ptr @a.bar,
 // CHECK-SAME: { ptr @a.bar,
+// CHECK-SAME: { ptr @a,
+// CHECK-SAME: { ptr @a,
+// CHECK-SAME: { ptr @a,
+// CHECK-SAME: { ptr @a,
 // CHECK-SAME: { ptr @sfoo,
 // CHECK-SAME: { ptr @sfoo,
 // CHECK-SAME: { ptr @foo,
 // CHECK-SAME: { ptr @foo,
 // CHECK-SAME: { ptr addrspacecast (ptr addrspace(1) @addrspace1_var to ptr),
-// CHECK-SAME: { ptr @a,
-// CHECK-SAME: { ptr @a,
-// CHECK-SAME: { ptr @a,
-// CHECK-SAME: { ptr @a,
 // CHECK-SAME: }], section "llvm.metadata"
 
 // AS1-GLOBALS: target datalayout = "{{.+}}-A5-G1"

diff  --git a/clang/test/CodeGenCXX/attr-annotate-destructor.cpp b/clang/test/CodeGenCXX/attr-annotate-destructor.cpp
deleted file mode 100644
index 1753c9eaed2d111..000000000000000
--- a/clang/test/CodeGenCXX/attr-annotate-destructor.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-// RUN: %clang_cc1 %s -S -emit-llvm -triple x86_64-unknown-linux-gnu -o - | FileCheck %s
-
-// Test annotation attributes on destructors doesn't crash.
-
-struct k {
-  ~k() __attribute__((annotate(""))) {}
-};
-void m() { k(); }
-
-// CHECK: @llvm.global.annotations = appending global [2 x { ptr, ptr, ptr, i32, ptr }] [{

diff  --git a/clang/test/CodeGenCXX/attr-annotate.cpp b/clang/test/CodeGenCXX/attr-annotate.cpp
index fd08f208fc9bcc6..705a0ef54376f4b 100644
--- a/clang/test/CodeGenCXX/attr-annotate.cpp
+++ b/clang/test/CodeGenCXX/attr-annotate.cpp
@@ -3,9 +3,9 @@
 //CHECK: @[[STR1:.*]] = private unnamed_addr constant [{{.*}} x i8] c"{{.*}}attr-annotate.cpp\00", section "llvm.metadata"
 //CHECK: @[[STR2:.*]] = private unnamed_addr constant [4 x i8] c"abc\00", align 1
 //CHECK: @[[STR:.*]] = private unnamed_addr constant [5 x i8] c"test\00", section "llvm.metadata"
-//CHECK: @[[ARGS:.*]] = private unnamed_addr constant { %struct.Struct } { %struct.Struct { ptr @_ZN1AIjLj9EE2SVE, ptr getelementptr (i8, ptr @_ZN1AIjLj9EE2SVE, i64 4) } }, section "llvm.metadata"
-//CHECK: @[[ARGS2:.*]] = private unnamed_addr constant { i32, ptr, i32 } { i32 9, ptr @[[STR2:.*]], i32 8 }, section "llvm.metadata"
-//CHECK: @llvm.global.annotations = appending global [2 x { ptr, ptr, ptr, i32, ptr }] [{ ptr, ptr, ptr, i32, ptr } { ptr @_ZN1AIjLj9EE5test2Ev, ptr @.str.6, ptr @.str.1, i32 24, ptr @[[ARGS]] }, { ptr, ptr, ptr, i32, ptr } { ptr @_ZN1AIjLj9EE4testILi8EEEvv, ptr @[[STR:.*]], ptr @[[STR1:.*]], i32 {{.*}}, ptr @[[ARGS2:.*]] }]
+//CHECK: @[[ARGS:.*]] = private unnamed_addr constant { i32, ptr, i32 } { i32 9, ptr @[[STR2:.*]], i32 8 }, section "llvm.metadata"
+//CHECK: @[[ARGS2:.*]] = private unnamed_addr constant { %struct.Struct } { %struct.Struct { ptr @_ZN1AIjLj9EE2SVE, ptr getelementptr (i8, ptr @_ZN1AIjLj9EE2SVE, i64 4) } }, section "llvm.metadata"
+//CHECK: @llvm.global.annotations = appending global [2 x { ptr, ptr, ptr, i32, ptr }] [{ ptr, ptr, ptr, i32, ptr } { ptr @_ZN1AIjLj9EE4testILi8EEEvv, ptr @[[STR:.*]], ptr @[[STR1:.*]], i32 {{.*}}, ptr @[[ARGS:.*]] }, { ptr, ptr, ptr, i32, ptr } { ptr @_ZN1AIjLj9EE5test2Ev, ptr @.str.6, ptr @.str.1, i32 24, ptr @[[ARGS2]] }]
 
 constexpr const char* str() {
   return "abc";


        


More information about the cfe-commits mailing list