[PATCH] D125095: [Clang][AIX] Add .ref in frontend for AIX XCOFF to support `-bcdtors:csect` linker option

ChenZheng via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 1 22:01:21 PDT 2022


shchenz added a comment.

Thanks for doing this. I am not familiar with the frontend, so I may be wrong/stupid in the follow comments : )
Hope other experts like @hubert.reinterpretcast can give more meaningful comments.

I tested on AIX, seems for static variable `static int x = foo();` in global scope, even compile with `-bcdtors:csect`, the init function also will not be eliminated. Could you please give an example to show why we need the new associated metadata for this case? Thanks.

And we may need to update the docs for `associated` metadata too in `docs/LangRef.rst`



================
Comment at: clang/lib/CodeGen/CGDeclCXX.cpp:542
+  if (getTriple().isOSAIX())
+    VFInitTermAssoc.push_back(std::make_pair(D, Fn));
+
----------------
Should we use `addVarTermAssoc`?


================
Comment at: clang/lib/CodeGen/CGDeclCXX.cpp:688
+        updateAssociatedFunc(VFInitTermAssoc, LocalCXXGlobalInits, GetElem, Fn);
+        updateAssociatedFunc(FFDtorTermAssoc, LocalCXXGlobalInits, GetElem, Fn);
+      }
----------------
`FFDtorTermAssoc` should store the mapping between dtor and term functions? So why we need to update this container when we generate wrapper function for init function? I think in the init function there should only be ctors related functions?

And why we don't need to update for `VarsWithInitTerm`, in that container there should be some static variables reply on the wrapper init function?


================
Comment at: clang/lib/CodeGen/CodeGenModule.cpp:4799
+    if (getTriple().isOSAIX())
+      addVarWithInitTerm(D, GV);
+  }
----------------
Why do we need to add mapping between a variable and its address? We already map the global and its init function in above `EmitCXXGlobalVarDeclInitFunc`?


================
Comment at: clang/lib/CodeGen/CodeGenModule.h:465
+  /// between dtor and term functions.
+  llvm::SmallVector<std::pair<const Decl *, llvm::Constant *>, 8>
+      VFInitTermAssoc;
----------------
Is there any reason why we need `vector` here instead of `map`? Can you give an example that shows one global variable will be connected with more than one init functions?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D125095/new/

https://reviews.llvm.org/D125095



More information about the cfe-commits mailing list