[PATCH] Implementation of #pragma (data|code|const|bss)_seg

Richard Smith richard at metafoo.co.uk
Wed Mar 26 18:00:39 PDT 2014



================
Comment at: lib/Parse/ParsePragma.cpp:438
@@ +437,3 @@
+  BalancedDelimiterTracker Parens(*this, tok::l_paren, tok::eof);
+  PP.Lex(Tok); // pragma kind
+  // Figure out which #pragma we're dealing with.  The switch has no default
----------------
It's strange to use `PP.Lex` here -- in the parser you should generally be using `ConsumeToken` instead. If you're trying to avoid updating `PrevTokLocation` (which seems like a good idea, since pragma tokens aren't tokens in the usual sense), you're not doing enough, because `BalancedDelimiterTracker` and `ParseStringLiteralExpression` will update it. Maybe save and restore it on entry to/exit from this function, and use `ConsumeToken` here?

================
Comment at: lib/Parse/ParsePragma.cpp:490-493
@@ +489,6 @@
+    }
+    SegmentName = cast<StringLiteral>(SegmentNameExpr.get());
+    // Setting section "" has no effect
+    if (SegmentName->getLength())
+      Action = (Sema::PragmaMsStackAction)(Action | Sema::PSK_Set);
+  }
----------------
This would fit better in the `ActOn...` functions. Generally, we try to avoid the parser inspecting AST nodes.

================
Comment at: lib/Parse/ParsePragma.cpp:487
@@ +486,3 @@
+    if (SegmentNameExpr.isInvalid()) {
+      PP.Diag(PragmaLoc, diag::warn_pragma_expected_string) << PragmaName;
+      goto ERROR_RETURN;
----------------
In this case, a diagnostic will already have been produced. (Generally speaking, when a function returns you an invalid `*Result` or a function returning `bool` on error returns `true`, that indicates that it has already produced a diagnostic.)

================
Comment at: lib/Parse/ParsePragma.cpp:485
@@ +484,3 @@
+  if (Tok.isNot(tok::r_paren)) {
+    ExprResult SegmentNameExpr = ParseStringLiteralExpression();
+    if (SegmentNameExpr.isInvalid()) {
----------------
Don't call this unless `isTokenStringLiteral()`, or it'll assert.


http://llvm-reviews.chandlerc.com/D3065



More information about the cfe-commits mailing list