[cfe-dev] clang::CodeGen::CodeGenModule::GetOrCreateLLVMGlobal
John McCall
rjmccall at apple.com
Mon Mar 10 16:07:51 PDT 2014
On Mar 10, 2014, at 8:40 AM, Rafael Espíndola <rafael.espindola at gmail.com> wrote:
> bccing cfe-dev, moving the cfe-commits
>
> On 10 March 2014 09:58, Vassil Vassilev <vasil.georgiev.vasilev at cern.ch> wrote:
>> Hi,
>> I noticed that CodeGenModule.cpp (around line number 1514):
>>
>> if (UnnamedAddr)
>> Entry->setUnnamedAddr(true);
>>
>> is executed only in the 'Get'-branch. I.e if the global doesn't exist this
>> flag is not taken into account. Is that an inconsistency or a desired
>> behavior?
>
> That is a bug, thanks!
>
> For
>
> struct Foo {
> ~Foo();
> };
> Foo x;
>
> We will output "@__dso_handle = external global i8", but an
> unnamed_addr gets added if a second "Foo y" is added.
>
> John (or Fariborz), can you check if the attached patch is doing the
> correct thing for obj-c?
The change to the test case is fine: the program does not rely on the address value of _NSConstantStringClassReference. I guess.
But.
I am not sure I understand the intended semantics of the UnnamedAddr argument to GetOrCreateLLVMGlobal. Is it “this use does not care about the specific address”? Because, if so, the (existing) logic is completely backwards: we need to be *clearing* the flag on the global if the argument is ever *false*. And that seems like the most reasonable semantics, frankly.
Also, the idea in the existing code that all runtime variables are unnamed_addr seems bogus to me. __dso_handle is a specific example of a variable whose address value *is* semantically important. This sort of thing would be important if there were any plausible transformations at all that involve unnamed_addr on external variable declarations.
Also, the assertion is wrong: if something introduces a “runtime" declaration (e.g. by just declaring and using a global variable with the right name) before CodeGen emits its first intrinsic use of it, the declaration will not be marked unnamed_addr.
So, basically, right now, this entire code path is useless and wrong. Is there a plan to apply it in situations where it wouldn’t be useless, i.e. to non-runtime user declarations?
John.
More information about the cfe-commits
mailing list