ChuanqiXu added inline comments.
================ Comment at: clang/lib/CodeGen/CGDeclCXX.cpp:621 +void CodeGenModule::EmitCXXModuleInitFunc(Module *Primary) { + while (!CXXGlobalInits.empty() && !CXXGlobalInits.back()) ---------------- iains wrote: > ChuanqiXu wrote: > > Recommend to comment related part in your summary. It should be much > > helpful for other to read the codes. > Hmm. I am not sure exactly what you mean here - there is a comment about the > purpose of the method, where the method is declared. > The commit message describes what this method does in the first part. I'm > happy to make things more clear, but not sure where you want to see some > change, I mean the paragraph: ``` For a module (instead of the generic CXX initializer) we emit a module init that: - wraps the contained initializations in a control variable to ensure that the inits only happen once, even if a module is imported many times by imports of the main unit. - calls module initialisers for imported modules first. Note that the order of module import is not significant, and therefore neither is the order of imported module initializers. - We then call initializers for the Global Module Fragment (if present) - We then call initializers for the current module. - We then call initializers for the Private Module Fragment (if present) ``` I understand people might feel like this is wordy. But, **personally**, I prefer readability. ================ Comment at: clang/lib/CodeGen/CGDeclCXX.cpp:645-646 + llvm::raw_svector_ostream Out(FnName); + cast<ItaniumMangleContext>(getCXXABI().getMangleContext()) + .mangleModuleInitializer(M, Out); + } ---------------- iains wrote: > ChuanqiXu wrote: > > mangleModuleInitializer is virtual function and we don't need to cast it. > Actually, 'mangleModuleInitializer' is not a virtual function of the > 'MangleContext' class, only of the 'ItaniumMangleContext'. > (see D122741). > > This because we do not know the mangling for MS and, in principle, there > might never be such a mangling (e.g. that implementation might deal with > P1874 in some different way). > > I did have a version of this where I amended the mangling to make the > function virtual in the 'MangleContext' class, but then that means generating > a dummy MS version that, as noted above, might never exist in reality. > I was just afraid of people might blame us to bring ABI specific things to CodeGen* things. I found there similar uses in CGVTables.cpp and CGVTT.cpp. So this might be acceptable too. ================ Comment at: clang/lib/CodeGen/CGDeclCXX.cpp:671 + ModuleInits.push_back(I->second); + } + PrioritizedCXXGlobalInits.clear(); ---------------- iains wrote: > ChuanqiXu wrote: > > I find the process here for `PrioritizedCXXGlobalInits` is much simpler > > than the one done in `CodeGenModule::EmitCXXGlobalInitFunc()`. It would > > generate more global init function. Doesn't it matter? > In the general CXX initializer the prioritized inits are grouped into > functions named in a way that allows them to be collated by other tools (e.g. > the static linker) so that init priority can be honoured over multiple TUs. > > This is not feasible for module initializers, there is no way to fuze them > across TUs (it would have no meaning). So I think all we need to do here is > to emit the calls in the correct order (in the end there are no more > initializer functions, we just skip the intermediated grouping functions, > > Of course, init priority is not mentioned in the standard, so that really > what would matter is that compiler 'vendors' agree on a sensible approach to > make sure code behaves in an expected manner for common toolchains. Yeah, the prioritized inits are really odd fashion to me.. I only saw such things in assembly. So my understanding to this one is that: (1) If we have prioritized inits in modules' code , it is not guaranteed to be initialized first. This is the vendors agreement. (2) If we link a static library (e.g., libgcc.a), the prioritized inits in that would still be initialized first. Do I understand right? ================ Comment at: clang/lib/CodeGen/CodeGenModule.cpp:2489 + // source, first Global Module Fragments, if present. + if (auto GMF = Primary->findSubmodule("<global>")) { + for (Decl *D : getContext().getModuleInitializers(GMF)) { ---------------- iains wrote: > ChuanqiXu wrote: > > Nit: I feel better to add methods like `Module > > *Module::getGlobalModuleFragment()`. I feel odd to use magic string here. > > But I am OK with it since there many magic string in CodeGen codes and we > > got in consensus before that we would need to do a lot of refactor work in > > the future. > yeah, I was intending to do this actually - although it only moves the magic > strings to a different place. It might be that we have enough bits in the > module type enumerator (already streamed) so that we could use up two values > with "GMF" and "PMF" module types. However IMO that should be a separate > change. We still need to use `auto *` instead of `auto` here. I remember this is recommended in clang's coding standards. ================ Comment at: clang/lib/CodeGen/CodeGenModule.cpp:2503 + // Third any associated with the Privat eMOdule Fragment, if present. + if (auto PMF = Primary->findSubmodule("<private>")) { + for (Decl *D : getContext().getModuleInitializers(PMF)) { ---------------- ChuanqiXu wrote: > Nit: with above: `Module *Module::getPrivateModuleFragment()`. Use auto* here. ================ Comment at: clang/lib/CodeGen/CodeGenModule.cpp:3206-3208 + bool MBEE = MayBeEmittedEagerly(Global); + if (MustBeEmitted(Global)) { + if (MBEE) { ---------------- iains wrote: > ChuanqiXu wrote: > > Is this change needed? Could you elaborate more on this? > the test is quite heavy, and is used twice when the assertions are enabled (I > do not mind to revert this part if that does not seem worthwhile). > I prefer to do such changes in a standalone NFC patch. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D126189/new/ https://reviews.llvm.org/D126189 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits