ParsePragma.cpp revision 84021556baceb76eedf7d44be8ba71d9b8cfacce
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 20b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis/// \brief Handle the annotation token produced for #pragma unused(...) 21b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis/// 22b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis/// Each annot_pragma_unused is followed by the argument token so e.g. 23b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis/// "#pragma unused(x,y)" becomes: 24b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis/// annot_pragma_unused 'x' annot_pragma_unused 'y' 25b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidisvoid Parser::HandlePragmaUnused() { 26b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis assert(Tok.is(tok::annot_pragma_unused)); 27b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis SourceLocation UnusedLoc = ConsumeToken(); 28b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis Actions.ActOnPragmaUnused(Tok, getCurScope(), UnusedLoc); 29b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis ConsumeToken(); // The argument token. 30b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis} 31aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman 32aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman// #pragma GCC visibility comes in two variants: 33aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman// 'push' '(' [visibility] ')' 34aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman// 'pop' 3580c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaGCCVisibilityHandler::HandlePragma(Preprocessor &PP, 3680c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor PragmaIntroducerKind Introducer, 3780c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor Token &VisTok) { 38aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman SourceLocation VisLoc = VisTok.getLocation(); 39aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman 40aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman Token Tok; 41aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman PP.Lex(Tok); 42aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman 43aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman const IdentifierInfo *PushPop = Tok.getIdentifierInfo(); 44aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman 45aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman bool IsPush; 46aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman const IdentifierInfo *VisType; 47aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman if (PushPop && PushPop->isStr("pop")) { 48aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman IsPush = false; 49aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman VisType = 0; 50aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman } else if (PushPop && PushPop->isStr("push")) { 51aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman IsPush = true; 52aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman PP.Lex(Tok); 53aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman if (Tok.isNot(tok::l_paren)) { 54aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) 55aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman << "visibility"; 56aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman return; 57aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman } 58aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman PP.Lex(Tok); 59aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman VisType = Tok.getIdentifierInfo(); 60aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman if (!VisType) { 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::r_paren)) { 67aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_rparen) 68aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman << "visibility"; 69aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman return; 70aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman } 71aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman } else { 72aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) 73aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman << "visibility"; 74aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman return; 75aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman } 76aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman PP.Lex(Tok); 7784021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne if (Tok.isNot(tok::eod)) { 78aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) 79aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman << "visibility"; 80aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman return; 81aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman } 82aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman 83aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman Actions.ActOnPragmaVisibility(IsPush, VisType, VisLoc); 84aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman} 85aa8b0d19244a6e7e8e5798fcc6aef003c274d3e0Eli Friedman 86fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// #pragma pack(...) comes in the following delicious flavors: 87fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// pack '(' [integer] ')' 88fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// pack '(' 'show' ')' 89fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar// pack '(' ('push' | 'pop') [',' identifier] [, integer] ')' 9080c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaPackHandler::HandlePragma(Preprocessor &PP, 9180c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor PragmaIntroducerKind Introducer, 9280c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor Token &PackTok) { 93fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar SourceLocation PackLoc = PackTok.getLocation(); 94fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar 95fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar Token Tok; 96fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar PP.Lex(Tok); 97fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar if (Tok.isNot(tok::l_paren)) { 984726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) << "pack"; 99fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar return; 100fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } 101fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar 102f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::PragmaPackKind Kind = Sema::PPK_Default; 103fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar IdentifierInfo *Name = 0; 10460d7b3a319d84d688752be3870615ac0f111fb16John McCall ExprResult Alignment; 105fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar SourceLocation LParenLoc = Tok.getLocation(); 1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PP.Lex(Tok); 107fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar if (Tok.is(tok::numeric_constant)) { 108fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar Alignment = Actions.ActOnNumericConstant(Tok); 1090e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl if (Alignment.isInvalid()) 110fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar return; 111fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar 112fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar PP.Lex(Tok); 113fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } else if (Tok.is(tok::identifier)) { 114fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar const IdentifierInfo *II = Tok.getIdentifierInfo(); 11508631c5fa053867146b5ee8be658c229f6bf127cChris Lattner if (II->isStr("show")) { 116f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::PPK_Show; 117fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar PP.Lex(Tok); 118fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } else { 11908631c5fa053867146b5ee8be658c229f6bf127cChris Lattner if (II->isStr("push")) { 120f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::PPK_Push; 12108631c5fa053867146b5ee8be658c229f6bf127cChris Lattner } else if (II->isStr("pop")) { 122f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::PPK_Pop; 123fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } else { 124fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_invalid_action); 125fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar return; 1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 127fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar PP.Lex(Tok); 1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 129fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar if (Tok.is(tok::comma)) { 130fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar PP.Lex(Tok); 1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 132fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar if (Tok.is(tok::numeric_constant)) { 133fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar Alignment = Actions.ActOnNumericConstant(Tok); 1340e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl if (Alignment.isInvalid()) 135fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar return; 136fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar 137fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar PP.Lex(Tok); 138fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } else if (Tok.is(tok::identifier)) { 139fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar Name = Tok.getIdentifierInfo(); 140fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar PP.Lex(Tok); 1411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 142fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar if (Tok.is(tok::comma)) { 143fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar PP.Lex(Tok); 1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 145fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar if (Tok.isNot(tok::numeric_constant)) { 14608631c5fa053867146b5ee8be658c229f6bf127cChris Lattner PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_malformed); 147fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar return; 148fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } 1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 150fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar Alignment = Actions.ActOnNumericConstant(Tok); 1510e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl if (Alignment.isInvalid()) 152fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar return; 153fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar 154fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar PP.Lex(Tok); 155fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } 156fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } else { 15708631c5fa053867146b5ee8be658c229f6bf127cChris Lattner PP.Diag(Tok.getLocation(), diag::warn_pragma_pack_malformed); 158fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar return; 159fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } 160fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } 161fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } 1620e9eabca263e8922bec0e2b38c8670eba9a39a1fSebastian Redl } 163fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar 164fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar if (Tok.isNot(tok::r_paren)) { 1654726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_rparen) << "pack"; 166fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar return; 167fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar } 168fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar 169861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar SourceLocation RParenLoc = Tok.getLocation(); 1709991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Lex(Tok); 17184021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne if (Tok.isNot(tok::eod)) { 1729991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << "pack"; 1739991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman return; 1749991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 1759991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 176effa8d1c97b00a3f53e972b0e61d9aade5ea1c57Sebastian Redl Actions.ActOnPragmaPack(Kind, Name, Alignment.release(), PackLoc, 177fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar LParenLoc, RParenLoc); 178fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar} 179fcdd8fe26de3eee44927600bf1853e21bd90dd84Daniel Dunbar 180cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar// #pragma 'align' '=' {'native','natural','mac68k','power','reset'} 181cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar// #pragma 'options 'align' '=' {'native','natural','mac68k','power','reset'} 182f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void ParseAlignPragma(Sema &Actions, Preprocessor &PP, Token &FirstTok, 183cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar bool IsOptions) { 184861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar Token Tok; 185cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar 186cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar if (IsOptions) { 187cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar PP.Lex(Tok); 188cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar if (Tok.isNot(tok::identifier) || 189cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar !Tok.getIdentifierInfo()->isStr("align")) { 190cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar PP.Diag(Tok.getLocation(), diag::warn_pragma_options_expected_align); 191cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar return; 192cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar } 193861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar } 194638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar 195861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar PP.Lex(Tok); 196861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar if (Tok.isNot(tok::equal)) { 197cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar PP.Diag(Tok.getLocation(), diag::warn_pragma_align_expected_equal) 198cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar << IsOptions; 199861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar return; 200861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar } 201861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar 202861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar PP.Lex(Tok); 203861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar if (Tok.isNot(tok::identifier)) { 204861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) 205cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar << (IsOptions ? "options" : "align"); 206861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar return; 207861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar } 208861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar 209f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::PragmaOptionsAlignKind Kind = Sema::POAK_Natural; 210861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar const IdentifierInfo *II = Tok.getIdentifierInfo(); 211638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar if (II->isStr("native")) 212f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Native; 213638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar else if (II->isStr("natural")) 214f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Natural; 2156f739145b94ede1ca98b5a5e0e179c817c405d7bDaniel Dunbar else if (II->isStr("packed")) 216f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Packed; 217861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar else if (II->isStr("power")) 218f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Power; 219861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar else if (II->isStr("mac68k")) 220f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Mac68k; 221861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar else if (II->isStr("reset")) 222f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Reset; 223861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar else { 224cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar PP.Diag(Tok.getLocation(), diag::warn_pragma_align_invalid_option) 225cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar << IsOptions; 226861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar return; 227861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar } 228861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar 229861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar SourceLocation KindLoc = Tok.getLocation(); 230861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar PP.Lex(Tok); 23184021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne if (Tok.isNot(tok::eod)) { 232861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) 233cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar << (IsOptions ? "options" : "align"); 234861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar return; 235861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar } 236861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar 237cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar Actions.ActOnPragmaOptionsAlign(Kind, FirstTok.getLocation(), KindLoc); 238cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar} 239cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar 24080c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaAlignHandler::HandlePragma(Preprocessor &PP, 24180c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor PragmaIntroducerKind Introducer, 24280c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor Token &AlignTok) { 243cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar ParseAlignPragma(Actions, PP, AlignTok, /*IsOptions=*/false); 244cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar} 245cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar 24680c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaOptionsHandler::HandlePragma(Preprocessor &PP, 24780c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor PragmaIntroducerKind Introducer, 24880c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor Token &OptionsTok) { 249cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar ParseAlignPragma(Actions, PP, OptionsTok, /*IsOptions=*/true); 250861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar} 251861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar 2524726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek// #pragma unused(identifier) 25380c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaUnusedHandler::HandlePragma(Preprocessor &PP, 25480c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor PragmaIntroducerKind Introducer, 25580c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor Token &UnusedTok) { 2564726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek // FIXME: Should we be expanding macros here? My guess is no. 2574726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek SourceLocation UnusedLoc = UnusedTok.getLocation(); 2581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2594726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek // Lex the left '('. 2604726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek Token Tok; 2614726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Lex(Tok); 2624726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek if (Tok.isNot(tok::l_paren)) { 2634726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) << "unused"; 2644726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek return; 2654726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 2664726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek SourceLocation LParenLoc = Tok.getLocation(); 2671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2684726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek // Lex the declaration reference(s). 2697a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek llvm::SmallVector<Token, 5> Identifiers; 2704726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek SourceLocation RParenLoc; 2714726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek bool LexID = true; 2721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2734726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek while (true) { 2744726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Lex(Tok); 2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2764726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek if (LexID) { 2771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Tok.is(tok::identifier)) { 2787a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek Identifiers.push_back(Tok); 2794726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek LexID = false; 2804726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek continue; 2814726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 2824726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek 2837a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek // Illegal token! 2844726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_var); 2854726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek return; 2864726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 2871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2884726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek // We are execting a ')' or a ','. 2894726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek if (Tok.is(tok::comma)) { 2904726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek LexID = true; 2914726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek continue; 2924726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 2931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2944726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek if (Tok.is(tok::r_paren)) { 2954726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek RParenLoc = Tok.getLocation(); 2964726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek break; 2974726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 2981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2997a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek // Illegal token! 3004726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_punc); 3014726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek return; 3024726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 3039991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3049991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Lex(Tok); 30584021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne if (Tok.isNot(tok::eod)) { 3069991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << 3079991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman "unused"; 3089991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman return; 3099991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 3109991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3114726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek // Verify that we have a location for the right parenthesis. 3124726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek assert(RParenLoc.isValid() && "Valid '#pragma unused' must have ')'"); 3137a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek assert(!Identifiers.empty() && "Valid '#pragma unused' must have arguments"); 3144726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek 315b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis // For each identifier token, insert into the token stream a 316b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis // annot_pragma_unused token followed by the identifier token. 317b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis // This allows us to cache a "#pragma unused" that occurs inside an inline 318b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis // C++ member function. 319b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis 320b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis Token *Toks = new Token[2*Identifiers.size()]; 321b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis for (unsigned i=0; i != Identifiers.size(); i++) { 322b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis Token &pragmaUnusedTok = Toks[2*i], &idTok = Toks[2*i+1]; 323b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis pragmaUnusedTok.startToken(); 324b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis pragmaUnusedTok.setKind(tok::annot_pragma_unused); 325b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis pragmaUnusedTok.setLocation(UnusedLoc); 326b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis idTok = Identifiers[i]; 327b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis } 328b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis PP.EnterTokenStream(Toks, 2*Identifiers.size(), /*DisableMacroExpansion=*/true, /*OwnsTokens=*/true); 3294726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek} 3309991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3319991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier 3329991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier '=' identifier 33380c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaWeakHandler::HandlePragma(Preprocessor &PP, 33480c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor PragmaIntroducerKind Introducer, 33580c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor Token &WeakTok) { 3369991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman // FIXME: Should we be expanding macros here? My guess is no. 3379991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman SourceLocation WeakLoc = WeakTok.getLocation(); 3389991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3399991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman Token Tok; 3409991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Lex(Tok); 3419991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman if (Tok.isNot(tok::identifier)) { 3429991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) << "weak"; 3439991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman return; 3449991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 3459991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3469991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman IdentifierInfo *WeakName = Tok.getIdentifierInfo(), *AliasName = 0; 3479991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman SourceLocation WeakNameLoc = Tok.getLocation(), AliasNameLoc; 3489991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3499991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Lex(Tok); 3509991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman if (Tok.is(tok::equal)) { 3519991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Lex(Tok); 3529991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman if (Tok.isNot(tok::identifier)) { 3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) 3549991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman << "weak"; 3559991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman return; 3569991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 3579991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman AliasName = Tok.getIdentifierInfo(); 3589991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman AliasNameLoc = Tok.getLocation(); 3599991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Lex(Tok); 3609991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 3619991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 36284021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne if (Tok.isNot(tok::eod)) { 3639991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << "weak"; 3649991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman return; 3659991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 3669991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3679991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman if (AliasName) { 3689991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman Actions.ActOnPragmaWeakAlias(WeakName, AliasName, WeakLoc, WeakNameLoc, 3699991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman AliasNameLoc); 3709991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } else { 3719991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman Actions.ActOnPragmaWeakID(WeakName, WeakLoc, WeakNameLoc); 3729991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 3739991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman} 374321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne 375321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbournevoid 376321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter CollingbournePragmaFPContractHandler::HandlePragma(Preprocessor &PP, 377321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne PragmaIntroducerKind Introducer, 378321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne Token &Tok) { 379321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne tok::OnOffSwitch OOS; 380321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne if (PP.LexOnOffSwitch(OOS)) 381321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne return; 382321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne 383321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne Actions.ActOnPragmaFPContract(OOS); 384321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne} 385f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 386f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbournevoid 387f315fa81eef1977b3457fd7a7d4639e060fe7278Peter CollingbournePragmaOpenCLExtensionHandler::HandlePragma(Preprocessor &PP, 388f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PragmaIntroducerKind Introducer, 389f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne Token &Tok) { 390f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Lex(Tok); 391f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne if (Tok.isNot(tok::identifier)) { 392f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) << 393f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne "OPENCL"; 394f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne return; 395f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 396f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne IdentifierInfo *ename = Tok.getIdentifierInfo(); 397f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne SourceLocation NameLoc = Tok.getLocation(); 398f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 399f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Lex(Tok); 400f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne if (Tok.isNot(tok::colon)) { 401f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_colon) << ename; 402f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne return; 403f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 404f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 405f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Lex(Tok); 406f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne if (Tok.isNot(tok::identifier)) { 407f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_enable_disable); 408f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne return; 409f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 410f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne IdentifierInfo *op = Tok.getIdentifierInfo(); 411f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 412f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne unsigned state; 413f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne if (op->isStr("enable")) { 414f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne state = 1; 415f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } else if (op->isStr("disable")) { 416f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne state = 0; 417f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } else { 418f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_enable_disable); 419f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne return; 420f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 421f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 422f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne OpenCLOptions &f = Actions.getOpenCLOptions(); 423f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne if (ename->isStr("all")) { 424f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#define OPENCLEXT(nm) f.nm = state; 425f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#include "clang/Basic/OpenCLExtensions.def" 426f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 427f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#define OPENCLEXT(nm) else if (ename->isStr(#nm)) { f.nm = state; } 428f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#include "clang/Basic/OpenCLExtensions.def" 429f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne else { 430f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Diag(NameLoc, diag::warn_pragma_unknown_extension) << ename; 431f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne return; 432f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 433f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne} 434f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 435