[PATCH] D125095: [Clang][AIX] Add .ref in frontend for AIX XCOFF to support `-bcdtors:csect` linker option
Ting Wang via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 8 04:41:24 PDT 2022
tingwang marked an inline comment as done.
tingwang added inline comments.
================
Comment at: clang/lib/CodeGen/CGDeclCXX.cpp:688
+ updateAssociatedFunc(VFInitTermAssoc, LocalCXXGlobalInits, GetElem, Fn);
+ updateAssociatedFunc(FFDtorTermAssoc, LocalCXXGlobalInits, GetElem, Fn);
+ }
----------------
shchenz wrote:
> `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?
> `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?
Thank you for pointing out! This is redundant.
> 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?
VarsWithInitTerm keeps track of mapping between variables in clang (Decl*) and the corresponding data structure in llvm (Constant *). To me it's stable, and not like functions which could be wrapped in new functions.
================
Comment at: clang/lib/CodeGen/CodeGenModule.cpp:4799
+ if (getTriple().isOSAIX())
+ addVarWithInitTerm(D, GV);
+ }
----------------
shchenz wrote:
> 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`?
It seems to me that clang most of the time operates on Decl*. However to generate metadata, we refer to llvm::Constant*. I did not find how to get llvm::Constant* from Decl* in clang, so I'm tracking that information. I will check again to see if there is any official way to do that but I'm not aware of.
================
Comment at: clang/lib/CodeGen/CodeGenModule.h:465
+ /// between dtor and term functions.
+ llvm::SmallVector<std::pair<const Decl *, llvm::Constant *>, 8>
+ VFInitTermAssoc;
----------------
shchenz wrote:
> 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?
One variable can have two functions associated: one init and one term, thus used vector for VFInitTermAssoc. Also it is better to use variable as key for the benefit of the inner for loop inside AddMeta.
Dtor-to-Term (FFDtorTermAssoc) could use map, however it shares similar update logic as VFInitTermAssoc (for example the code snippet AddMeta in CodeGenModule::genAssocMeta() is used on both data structure), so I prefer to use vector for both of them.
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