================
Comment at: include/clang/AST/Decl.h:312
@@ -310,1 +311,3 @@
   LabelStmt *TheStmt;
+  SmallString<16> MSAsmName;
+  bool MSAsmNameResolved;
----------------
ehsan wrote:
> rnk wrote:
> > This will cause a memory leak for names > 16 chars. When the ASTContext is 
> > destroyed, it doesn't actually call destructors of individual AST nodes, it 
> > merely frees the memory. This should be a StringRef that points to memory 
> > from 'new (Context, 1) char[Len]', probably.
> Oh, I didn't know that!  What's this 'new (Contex, 1) char[Len]' trick?  I'm 
> not familiar with it, I don't think...
It's an operator new overload declared in ASTContext.h. Basically, it's 
equivalent to 'new char[Len]', except it goes calls the 'void* operator 
new(size_t Bytes, ASTContext &Context, size_t Alignment)' overload.

================
Comment at: lib/Sema/SemaStmt.cpp:2357-2358
@@ +2356,4 @@
+  if (TheDecl->isMSAsmLabel()) {
+    // TODO Move this diagnostic elsewhere so that we get to examine the goto
+    // statements after we've seen all of the body of the current scope.
+    StmtResult error(StmtError(Diag(GotoLoc, diag::err_goto_ms_asm_label)
----------------
ehsan wrote:
> rnk wrote:
> > Does it help if you issue the same diagnostic when processing 'foo:' in 
> > this example?
> >   void f() {
> >     goto foo;
> >     __asm {
> >     foo:
> >       nop
> >     }
> >   }
> > 
> > After issuing the diagnostic, you can avoid the "undeclared label" knock-on 
> > errors by pretending that you did in fact define the label.
> I cannot issue the diagnostic there because I will not have a GotoStmt 
> pointer when processing `foo:`.  That's really the main issue.
> 
> What I would ideally do would be to not issue any diagnostics in 
> ActOnGotoStmt, and wait until the scope is fully processed, then visit all of 
> the GotoStmts in the scope, check their LabelDecls to see if they're asm 
> labels and issue the diagnostic there.  But I don't know where I would hook 
> into in order to be able to visit all of the GotoStmts at the end of a scope.
Looks like we have JumpDiagnostics.cpp for this purpose... See if you can work 
it in there?

================
Comment at: lib/Sema/SemaStmtAsm.cpp:534
@@ +533,3 @@
+    // name.
+    OS << llvm::format("__MSASMLABEL_.%" PRIu32 "__", counter++);
+    Label->setMSAsmLabel(OS.str());
----------------
ehsan wrote:
> rnk wrote:
> > We should be able to use the 'L' assembler prefix to suppress the symbol 
> > table entry for the label. I'm happy as long as both 'nm' and 'dumpbin 
> > /symbols' agree that there are no MSASMLABEL symbols in the object file. I 
> > think it will with the code as written.
> > 
> > I'd also try to get the user-written label in there, so that the -S output 
> > is more intelligible, something like:
> >   OS << "L__MSASMLABEL_" << counter++ << "__" << ExternalLabelName;
> > 
> > Users can't make labels that start with 'L', so we should be safe from 
> > collisions, we just need a unique counter to make sure we don't collide 
> > with ourselves.
> I think you brought this issue up before.  :)  I am turning these names into 
> local symbol names in http://reviews.llvm.org/D4587 by using 
> getPrivateGlobalPrefix() when rewriting `AOK_Label`.  I don't think that we 
> need to store that prefix in the AST, do we?
> 
> Your suggestion to add the user-written label in the name is a good one, it 
> just needs me to change all of these tests again!  ;)  But I'll do it in the 
> next iteration.
> 
> On the issue of counter uniqueness, the current global counter obviously 
> ensures that.  If we have one Sema object per each compilation, then making 
> it a Sema member won't change things, so we should be good there.
OK, doing this in LLVM MC seems great.

================
Comment at: test/Sema/ms-inline-asm.c:145
@@ +144,3 @@
+void t10() {
+// TODO: The diagnostic below has the wrong location, because we don't have a 
better location in CheckPoppedLabel
+foo: // expected-error {{use of undeclared label 'foo'}}
----------------
ehsan wrote:
> Any ideas how I can fix this?  Or is the current misplaced diagnostic 
> acceptable?
Moving to JumpDiagnostics.cpp will probably fix it.

http://reviews.llvm.org/D4589



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to