================
@@ -1070,13 +1076,26 @@
CodeGenFunction::GenerateCXXGlobalInitFunc(llvm::Function *Fn,
// Mark as initialized before initializing anything else. If the
// initializers use previously-initialized thread_local vars, that's
// probably supposed to be OK, but the standard doesn't say.
- Builder.CreateStore(llvm::ConstantInt::get(GuardVal->getType(),1),
Guard);
-
- // The guard variable can't ever change again.
- EmitInvariantStart(
- Guard.getPointer(),
- CharUnits::fromQuantity(
- CGM.getDataLayout().getTypeAllocSize(GuardVal->getType())));
+ if (auto *GV = dyn_cast<llvm::GlobalValue>(Guard.getPointer()))
+ // Get the thread-local address via intrinsic.
+ if (GV->isThreadLocal())
+ GuardAddr = GuardAddr.withPointer(
+ Builder.CreateThreadLocalAddress(GV), NotKnownNonNull);
+ Builder.CreateStore(llvm::ConstantInt::get(GuardVal->getType(), 1),
+ GuardAddr);
+
+ // Emit invariant start for TLS guard address.
+ if (CGM.getCodeGenOpts().OptimizationLevel > 0) {
+ uint64_t Width =
+ CGM.getDataLayout().getTypeAllocSize(GuardVal->getType());
+ llvm::Value *TLSAddr = Guard.getPointer();
+ if (auto *GV = dyn_cast<llvm::GlobalValue>(Guard.getPointer()))
+ // Get the thread-local address via intrinsic.
+ if (GV->isThreadLocal())
+ TLSAddr = Builder.CreateThreadLocalAddress(GV);
+ Builder.CreateInvariantStart(
----------------
ChuanqiXu9 wrote:
I mean, it used `EmitInvariantStart` but now it uses `CreateInvariantStart`.
(Sorry, I meant to use API)
https://github.com/llvm/llvm-project/pull/96633
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits