ParsePragma.cpp revision 80c60f72848896f867f6b7e664e7060d9e78f019
1fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//===--- ParsePragma.cpp - Language specific pragma parsing ---------------===//
2fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//
3fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//                     The LLVM Compiler Infrastructure
4fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//
5fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// This file is distributed under the University of Illinois Open Source
6fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// License. See LICENSE.TXT for details.
7fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//
8fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//===----------------------------------------------------------------------===//
9fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//
10fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// This file implements the language specific #pragma handlers.
11fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//
12fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//===----------------------------------------------------------------------===//
13fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
14fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar#include "ParsePragma.h"
15500d3297d2a21edeac4d46cbcbe21bc2352c2a28Chris Lattner#include "clang/Parse/ParseDiagnostic.h"
164726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek#include "clang/Parse/Parser.h"
1719510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Lex/Preprocessor.h"
18fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbarusing namespace clang;
19fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
20aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
21aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman// #pragma GCC visibility comes in two variants:
22aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman//   'push' '(' [visibility] ')'
23aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman//   'pop'
2480c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaGCCVisibilityHandler::HandlePragma(Preprocessor &PP,
2580c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                              PragmaIntroducerKind Introducer,
2680c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                              Token &VisTok) {
27aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  SourceLocation VisLoc = VisTok.getLocation();
28aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
29aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  Token Tok;
30aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  PP.Lex(Tok);
31aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
32aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  const IdentifierInfo *PushPop = Tok.getIdentifierInfo();
33aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
34aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  bool IsPush;
35aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  const IdentifierInfo *VisType;
36aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  if (PushPop && PushPop->isStr("pop")) {
37aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    IsPush = false;
38aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    VisType = 0;
39aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  } else if (PushPop && PushPop->isStr("push")) {
40aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    IsPush = true;
41aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    PP.Lex(Tok);
42aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    if (Tok.isNot(tok::l_paren)) {
43aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen)
44aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman        << "visibility";
45aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      return;
46aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    }
47aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    PP.Lex(Tok);
48aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    VisType = Tok.getIdentifierInfo();
49aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    if (!VisType) {
50aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier)
51aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman        << "visibility";
52aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      return;
53aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    }
54aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    PP.Lex(Tok);
55aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    if (Tok.isNot(tok::r_paren)) {
56aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_rparen)
57aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman        << "visibility";
58aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      return;
59aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    }
60aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  } else {
61aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier)
62aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      << "visibility";
63aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    return;
64aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  }
65aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  PP.Lex(Tok);
66aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  if (Tok.isNot(tok::eom)) {
67aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol)
68aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman      << "visibility";
69aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman    return;
70aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  }
71aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
72aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman  Actions.ActOnPragmaVisibility(IsPush, VisType, VisLoc);
73aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman}
74aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman
75fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// #pragma pack(...) comes in the following delicious flavors:
76fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//   pack '(' [integer] ')'
77fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//   pack '(' 'show' ')'
78fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar//   pack '(' ('push' | 'pop') [',' identifier] [, integer] ')'
7980c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaPackHandler::HandlePragma(Preprocessor &PP,
8080c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                     PragmaIntroducerKind Introducer,
8180c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                     Token &PackTok) {
82fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  SourceLocation PackLoc = PackTok.getLocation();
83fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
84fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  Token Tok;
85fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  PP.Lex(Tok);
86fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  if (Tok.isNot(tok::l_paren)) {
874726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) << "pack";
88fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    return;
89fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  }
90fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
91f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  Sema::PragmaPackKind Kind = Sema::PPK_Default;
92fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  IdentifierInfo *Name = 0;
9360d7b3a319d84d688752be3870615ac0f111fb16John McCall  ExprResult Alignment;
94fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  SourceLocation LParenLoc = Tok.getLocation();
951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  PP.Lex(Tok);
96fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  if (Tok.is(tok::numeric_constant)) {
97fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    Alignment = Actions.ActOnNumericConstant(Tok);
980e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl    if (Alignment.isInvalid())
99fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      return;
100fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
101fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    PP.Lex(Tok);
102fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  } else if (Tok.is(tok::identifier)) {
103fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    const IdentifierInfo *II = Tok.getIdentifierInfo();
10408631c5fa053867146b5ee8be658c229f6bf127cChris Lattner    if (II->isStr("show")) {
105f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall      Kind = Sema::PPK_Show;
106fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      PP.Lex(Tok);
107fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    } else {
10808631c5fa053867146b5ee8be658c229f6bf127cChris Lattner      if (II->isStr("push")) {
109f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        Kind = Sema::PPK_Push;
11008631c5fa053867146b5ee8be658c229f6bf127cChris Lattner      } else if (II->isStr("pop")) {
111f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall        Kind = Sema::PPK_Pop;
112fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      } else {
113fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_invalid_action);
114fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        return;
1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      }
116fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      PP.Lex(Tok);
1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
118fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      if (Tok.is(tok::comma)) {
119fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        PP.Lex(Tok);
1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
121fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        if (Tok.is(tok::numeric_constant)) {
122fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          Alignment = Actions.ActOnNumericConstant(Tok);
1230e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl          if (Alignment.isInvalid())
124fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            return;
125fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
126fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          PP.Lex(Tok);
127fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        } else if (Tok.is(tok::identifier)) {
128fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          Name = Tok.getIdentifierInfo();
129fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          PP.Lex(Tok);
1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
131fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          if (Tok.is(tok::comma)) {
132fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            PP.Lex(Tok);
1331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
134fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            if (Tok.isNot(tok::numeric_constant)) {
13508631c5fa053867146b5ee8be658c229f6bf127cChris Lattner              PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_malformed);
136fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar              return;
137fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            }
1381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
139fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            Alignment = Actions.ActOnNumericConstant(Tok);
1400e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl            if (Alignment.isInvalid())
141fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar              return;
142fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
143fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar            PP.Lex(Tok);
144fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          }
145fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        } else {
14608631c5fa053867146b5ee8be658c229f6bf127cChris Lattner          PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_malformed);
147fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar          return;
148fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar        }
149fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar      }
150fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    }
1510e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl  }
152fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
153fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  if (Tok.isNot(tok::r_paren)) {
1544726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_rparen) << "pack";
155fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar    return;
156fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar  }
157fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
158861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  SourceLocation RParenLoc = Tok.getLocation();
1599991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
1609991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::eom)) {
1619991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << "pack";
1629991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
1639991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
1649991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
165effa8d1c97b00a3f53e972b0e61d9aade5ea1c57Sebastian Redl  Actions.ActOnPragmaPack(Kind, Name, Alignment.release(), PackLoc,
166fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar                          LParenLoc, RParenLoc);
167fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar}
168fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar
169cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar// #pragma 'align' '=' {'native','natural','mac68k','power','reset'}
170cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar// #pragma 'options 'align' '=' {'native','natural','mac68k','power','reset'}
171f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void ParseAlignPragma(Sema &Actions, Preprocessor &PP, Token &FirstTok,
172cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar                             bool IsOptions) {
173861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  Token Tok;
174cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar
175cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar  if (IsOptions) {
176cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar    PP.Lex(Tok);
177cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar    if (Tok.isNot(tok::identifier) ||
178cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar        !Tok.getIdentifierInfo()->isStr("align")) {
179cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      PP.Diag(Tok.getLocation(), diag::warn_pragma_options_expected_align);
180cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      return;
181cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar    }
182861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  }
183638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar
184861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  PP.Lex(Tok);
185861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  if (Tok.isNot(tok::equal)) {
186cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar    PP.Diag(Tok.getLocation(), diag::warn_pragma_align_expected_equal)
187cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      << IsOptions;
188861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    return;
189861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  }
190861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar
191861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  PP.Lex(Tok);
192861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  if (Tok.isNot(tok::identifier)) {
193861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier)
194cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      << (IsOptions ? "options" : "align");
195861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    return;
196861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  }
197861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar
198f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall  Sema::PragmaOptionsAlignKind Kind = Sema::POAK_Natural;
199861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  const IdentifierInfo *II = Tok.getIdentifierInfo();
200638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar  if (II->isStr("native"))
201f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Native;
202638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar  else if (II->isStr("natural"))
203f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Natural;
2046f739145b94ede1ca98b5a5e0e179c817c405d7bDaniel Dunbar  else if (II->isStr("packed"))
205f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Packed;
206861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  else if (II->isStr("power"))
207f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Power;
208861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  else if (II->isStr("mac68k"))
209f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Mac68k;
210861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  else if (II->isStr("reset"))
211f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall    Kind = Sema::POAK_Reset;
212861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  else {
213cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar    PP.Diag(Tok.getLocation(), diag::warn_pragma_align_invalid_option)
214cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      << IsOptions;
215861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    return;
216861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  }
217861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar
218861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  SourceLocation KindLoc = Tok.getLocation();
219861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  PP.Lex(Tok);
220861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  if (Tok.isNot(tok::eom)) {
221861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol)
222cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar      << (IsOptions ? "options" : "align");
223861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar    return;
224861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar  }
225861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar
226cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar  Actions.ActOnPragmaOptionsAlign(Kind, FirstTok.getLocation(), KindLoc);
227cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar}
228cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar
22980c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaAlignHandler::HandlePragma(Preprocessor &PP,
23080c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                      PragmaIntroducerKind Introducer,
23180c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                      Token &AlignTok) {
232cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar  ParseAlignPragma(Actions, PP, AlignTok, /*IsOptions=*/false);
233cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar}
234cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar
23580c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaOptionsHandler::HandlePragma(Preprocessor &PP,
23680c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                        PragmaIntroducerKind Introducer,
23780c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                        Token &OptionsTok) {
238cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar  ParseAlignPragma(Actions, PP, OptionsTok, /*IsOptions=*/true);
239861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar}
240861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar
2414726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek// #pragma unused(identifier)
24280c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaUnusedHandler::HandlePragma(Preprocessor &PP,
24380c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                       PragmaIntroducerKind Introducer,
24480c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                       Token &UnusedTok) {
2454726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // FIXME: Should we be expanding macros here? My guess is no.
2464726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  SourceLocation UnusedLoc = UnusedTok.getLocation();
2471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2484726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Lex the left '('.
2494726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  Token Tok;
2504726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  PP.Lex(Tok);
2514726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  if (Tok.isNot(tok::l_paren)) {
2524726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) << "unused";
2534726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    return;
2544726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  }
2554726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  SourceLocation LParenLoc = Tok.getLocation();
2561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2574726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Lex the declaration reference(s).
2587a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek  llvm::SmallVector<Token, 5> Identifiers;
2594726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  SourceLocation RParenLoc;
2604726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  bool LexID = true;
2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2624726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  while (true) {
2634726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Lex(Tok);
2641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2654726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (LexID) {
2661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (Tok.is(tok::identifier)) {
2677a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek        Identifiers.push_back(Tok);
2684726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        LexID = false;
2694726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek        continue;
2704726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      }
2714726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
2727a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek      // Illegal token!
2734726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_var);
2744726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      return;
2754726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
2761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2774726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    // We are execting a ')' or a ','.
2784726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (Tok.is(tok::comma)) {
2794726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      LexID = true;
2804726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      continue;
2814726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2834726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    if (Tok.is(tok::r_paren)) {
2844726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      RParenLoc = Tok.getLocation();
2854726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek      break;
2864726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    }
2871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2887a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek    // Illegal token!
2894726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_punc);
2904726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek    return;
2914726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  }
2929991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
2939991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
2949991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::eom)) {
2959991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) <<
2969991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman        "unused";
2979991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
2989991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
2999991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3004726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  // Verify that we have a location for the right parenthesis.
3014726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek  assert(RParenLoc.isValid() && "Valid '#pragma unused' must have ')'");
3027a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek  assert(!Identifiers.empty() && "Valid '#pragma unused' must have arguments");
3034726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek
3041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Perform the action to handle the pragma.
3057a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek  Actions.ActOnPragmaUnused(Identifiers.data(), Identifiers.size(),
30623c94dbb6631fecdb55ba401aa93722803d980c6Douglas Gregor                            parser.getCurScope(), UnusedLoc, LParenLoc, RParenLoc);
3074726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek}
3089991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3099991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier
3109991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier '=' identifier
31180c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaWeakHandler::HandlePragma(Preprocessor &PP,
31280c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                     PragmaIntroducerKind Introducer,
31380c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor                                     Token &WeakTok) {
3149991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  // FIXME: Should we be expanding macros here? My guess is no.
3159991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  SourceLocation WeakLoc = WeakTok.getLocation();
3169991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3179991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  Token Tok;
3189991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
3199991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::identifier)) {
3209991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) << "weak";
3219991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
3229991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
3239991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3249991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  IdentifierInfo *WeakName = Tok.getIdentifierInfo(), *AliasName = 0;
3259991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  SourceLocation WeakNameLoc = Tok.getLocation(), AliasNameLoc;
3269991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3279991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  PP.Lex(Tok);
3289991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.is(tok::equal)) {
3299991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Lex(Tok);
3309991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    if (Tok.isNot(tok::identifier)) {
3311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier)
3329991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman          << "weak";
3339991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman      return;
3349991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    }
3359991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    AliasName = Tok.getIdentifierInfo();
3369991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    AliasNameLoc = Tok.getLocation();
3379991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Lex(Tok);
3389991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
3399991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3409991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (Tok.isNot(tok::eom)) {
3419991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << "weak";
3429991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    return;
3439991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
3449991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman
3459991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  if (AliasName) {
3469991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    Actions.ActOnPragmaWeakAlias(WeakName, AliasName, WeakLoc, WeakNameLoc,
3479991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman                                 AliasNameLoc);
3489991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  } else {
3499991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman    Actions.ActOnPragmaWeakID(WeakName, WeakLoc, WeakNameLoc);
3509991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman  }
3519991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman}
352