eandrews added inline comments.

================
Comment at: lib/CodeGen/CodeGenModule.cpp:2434
+    // Emit section information for extern variables.
+    if (D->hasExternalStorage() && !D->isThisDeclarationADefinition()) {
+      if (const SectionAttr *SA = D->getAttr<SectionAttr>())
----------------
efriedma wrote:
> eandrews wrote:
> > efriedma wrote:
> > > Why do you specifically check "D->hasExternalStorage() && 
> > > !D->isThisDeclarationADefinition()", instead of just setting the section 
> > > unconditionally?
> > I noticed that you enter GetOrCreateLLVMGlobal( ) whenever the extern 
> > variable is declared as well as when it is defined. The flow of the program 
> > is different in each case. When the variable is defined, it also enters 
> > EmitGlobalVarDefinition( ). There is existing code handling section 
> > information here. I added the check in GetOrCreateLLVMGlobal( ) so the 
> > block gets skipped for variable definition, since its already handled 
> > elsewhere.
> I would rather just call setSection unconditionally here, as opposed to 
> trying to guess whether the global will eventually be defined.
> 
> I'm also sort of concerned the behavior here could be weird if a section 
> attribute is added on a redeclaration (e.g. what happens if you write `extern 
> int x; int y = &x; extern int x __attribute((section("foo")));`)... maybe we 
> should emit a warning?
@efriedma  I modified the patch to emit a warning in the scenario you 
mentioned. A warning is also emitted for the following - 

```extern int x;  int *y=&x; int x __attribute__((section("foo"))); 
```
I thought it made sense to emit the warning for the latter as well. Should I 
restrict the warning to just redeclarations (without definition) instead?


https://reviews.llvm.org/D36487



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

Reply via email to