[clang] [CIR] Upstream global variable linkage types (PR #129072)

Bruno Cardoso Lopes via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 28 16:34:56 PST 2025


================
@@ -210,6 +223,193 @@ void CIRGenModule::emitGlobalDefinition(clang::GlobalDecl gd,
   llvm_unreachable("Invalid argument to CIRGenModule::emitGlobalDefinition");
 }
 
+static bool shouldBeInCOMDAT(CIRGenModule &cgm, const Decl &d) {
+  assert(!cir::MissingFeatures::supportComdat());
+
+  if (d.hasAttr<SelectAnyAttr>())
+    return true;
+
+  GVALinkage linkage;
+  if (auto *vd = dyn_cast<VarDecl>(&d))
+    linkage = cgm.getASTContext().GetGVALinkageForVariable(vd);
+  else
+    linkage =
+        cgm.getASTContext().GetGVALinkageForFunction(cast<FunctionDecl>(&d));
+
+  switch (linkage) {
+  case clang::GVA_Internal:
+  case clang::GVA_AvailableExternally:
+  case clang::GVA_StrongExternal:
+    return false;
+  case clang::GVA_DiscardableODR:
+  case clang::GVA_StrongODR:
+    return true;
+  }
+  llvm_unreachable("No such linkage");
+}
+
+// TODO(CIR): this could be a common method between LLVM codegen.
+static bool isVarDeclStrongDefinition(const ASTContext &astContext,
----------------
bcardosolopes wrote:

I have annotated tons of these functions around, I think they resemble the idea of `ASTCodegenHelpers`, since they allow AST queries that have no dependency to codegen and are also useful to other tools (each these days implement their own). Not sure where exactly the implementation should live, but it would be nice if those can be exposed on a public header

https://github.com/llvm/llvm-project/pull/129072


More information about the cfe-commits mailing list