efriedma added inline comments.

================
Comment at: clang/lib/CodeGen/CodeGenModule.cpp:4852
+          if (!CD->isTrivial() && !D->getTLSKind())
+            NeedsGlobalCtor = true;
+        }
----------------
zahiraam wrote:
> efriedma wrote:
> > zahiraam wrote:
> > > efriedma wrote:
> > > > I have no idea what this code is supposed to do.
> > > I have removed from this the thread_local variables for being processed 
> > > the same way. Maybe they should be included, not sure?
> > > 
> > > For the rest is to differentiate between these cases. I found the 2nd 
> > > test case while doing some unit testing.
> > > 
> > >   struct B {
> > >   constexpr B() {}
> > >   ~B() {};
> > >   };
> > >   constinit B b;
> > > 
> > > 
> > > and
> > > 
> > >   struct A {
> > >     int s;
> > >     ~A();
> > >   };
> > > 
> > >   struct D : A {};
> > >   D d1 = {};
> > > 
> > > I think the second test case is not supposed to EmitDeclInit in 
> > > EmitCXXGlobalVarDeclInit right? But since now tryEmitForInitializer is 
> > > returning an Initializer, then NeedsGlobalCtor = true; 
> > > 
> > > Actually, when I removed this code, I have 2 LIT tests failing with the 
> > > same crash. 
> > > WDYT?
> > > 
> > > 
> > I'm not sure how thread-local var init works on Windows off the top of my 
> > head; I'd need to check.
> > 
> > For the given testcases, neither one of those cases should be calling 
> > EmitDeclInit; we use constant initialization for both cases, so the global 
> > init func should just be registering the destructors.  We shouldn't need to 
> > examine the initializer beyond checking whether tryEmitForInitializer 
> > succeeds.
> > 
> > Not sure what's crashing from your description.
> Removing this code will still result, in both cases to the call to 
> EmitDeclInit, because the first call to EmitCXXCtorInit is called with 
> PerformInit true. 
> 
> Calling EmitCXXCtorInit with false would result into a ctor function with an 
> empty body for the 1st test case (struct B):
>   define internal void @ctor() #0 {
>   entry:
>     ret void
>   }
> 
> I would have thought that we should have something like this:
> 
>   define internal void @ctor() #0 {
>   entry:
>     %call = call x86_thiscallcc ptr @"??0B@@QAE@XZ"(ptr nonnull align 1 
> dereferenceable(1) @"?b@@3UB@@A")
>     ret void
>   }
> 
> No?
> because the first call to EmitCXXCtorInit is called with PerformInit true.

That sounds wrong; if tryEmitForInitializer succeeds, we shouldn't perform the 
init at all.


================
Comment at: clang/lib/CodeGen/CodeGenModule.cpp:5009
+  if (isStaticInit(D, getLangOpts()) && NeedsGlobalCtor && NeedsGlobalDtor) {
+    EmitCXXCtorInit(D, GV, true, 201, llvm::StringLiteral("ctor"), false);
+    EmitCXXCtorInit(D, GV, false, 65535, llvm::StringLiteral("dtor"), true);
----------------
zahiraam wrote:
> efriedma wrote:
> > I think you want to use priority 201 whether or not there's a destructor.
> Is that what you mean?
I think it should look something more like this:

```
if (isStaticInit(D, getLangOpts()) {
  if (NeedsGlobalCtor)
    EmitCXXCtorInit(D, GV, true, 201, llvm::StringLiteral("ctor"), false);
  if (NeedsGlobalDtor)
    EmitCXXCtorInit(D, GV, false, 65535, llvm::StringLiteral("dtor"), true);
  DelayedCXXInitPosition[D] = ~0U;
} else {
  EmitCXXGlobalVarDeclInitFunc(D, GV, NeedsGlobalCtor);
}


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

https://reviews.llvm.org/D137107

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to