================
@@ -1262,6 +1277,26 @@
LoweringPreparePass::buildCXXGlobalVarDeclInitFunc(cir::GlobalOp op) {
// If this is a global TLS variable (that is, declared at namespace scope),
we
// have to emit the guard variable here.
bool needsTlsGuard = op.getTlsRefs() && op.getTlsRefs()->getGuardName();
+
+ // Non-TLS globals (such as weak/linkonce_odr/inline-ns scope variables) use
+ // the __cxa_guard_acquire/release instead of the TLS guard.
+ if (!needsTlsGuard && op.getDynamicInitGuard()) {
+ if (!op.getDynamicInitInfo()) {
+ op->emitError(
+ "guarded global with a guard is missing 'dynamic_init_info'");
+ return {};
+ }
+
+ if (op.getDynamicInitInfo()->getLocal()) {
+ op->emitError("guarded global is marked local");
+ return {};
+ }
+ emitGuardedInit(builder, op, op.getCtorRegion(), op.getDtorRegion());
----------------
erichkeane wrote:
This took AGES to find something that caused a problem here! I considered just
adding max-blocks to GlobalOp, which seemed fine (and the test added that
resulted in it being AnyRegion didn't repro the issue!).
You have to do some pretty awful things to the language in order to make
multiple blocks.
However, the work to make sure we properly copy those/etc for some pretty
obnoxious reproducers caused me to think that setting GlobalOp to just use
MaxRegions as well is the right idea. I had to do some minor work in CIRGenCXX
to 'wrap' multiple blocks in 1 region, but that seemed like the lesser of 2
evils here.
You're really hitting me hard here :D
https://github.com/llvm/llvm-project/pull/228586
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits