ParsePragma.cpp revision e23af2a86ed22c2a11d820820b78353b095e7ae7
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; 41e23af2a86ed22c2a11d820820b78353b095e7ae7Joerg Sonnenberger PP.LexUnexpandedToken(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; 52e23af2a86ed22c2a11d820820b78353b095e7ae7Joerg Sonnenberger PP.LexUnexpandedToken(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 } 58e23af2a86ed22c2a11d820820b78353b095e7ae7Joerg Sonnenberger PP.LexUnexpandedToken(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 } 65e23af2a86ed22c2a11d820820b78353b095e7ae7Joerg Sonnenberger PP.LexUnexpandedToken(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 } 76e23af2a86ed22c2a11d820820b78353b095e7ae7Joerg Sonnenberger PP.LexUnexpandedToken(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 18062c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian// #pragma ms_struct on 18162c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian// #pragma ms_struct off 18262c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanianvoid PragmaMSStructHandler::HandlePragma(Preprocessor &PP, 18362c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian PragmaIntroducerKind Introducer, 18462c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian Token &MSStructTok) { 18562c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian Sema::PragmaMSStructKind Kind = Sema::PMSST_OFF; 18662c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian 18762c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian Token Tok; 18862c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian PP.Lex(Tok); 18962c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian if (Tok.isNot(tok::identifier)) { 19062c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian PP.Diag(Tok.getLocation(), diag::warn_pragma_ms_struct); 19162c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian return; 19262c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian } 19362c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian const IdentifierInfo *II = Tok.getIdentifierInfo(); 19462c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian if (II->isStr("on")) { 19562c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian Kind = Sema::PMSST_ON; 19662c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian PP.Lex(Tok); 19762c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian } 19862c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian else if (II->isStr("off") || II->isStr("reset")) 19962c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian PP.Lex(Tok); 20062c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian else { 20162c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian PP.Diag(Tok.getLocation(), diag::warn_pragma_ms_struct); 20262c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian return; 20362c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian } 20462c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian 20562c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian if (Tok.isNot(tok::eod)) { 20662c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << "ms_struct"; 20762c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian return; 20862c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian } 20962c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian Actions.ActOnPragmaMSStruct(Kind); 21062c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian} 21162c9258f4a71569a66d805fc7776526a2c76b34eFariborz Jahanian 212cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar// #pragma 'align' '=' {'native','natural','mac68k','power','reset'} 213cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar// #pragma 'options 'align' '=' {'native','natural','mac68k','power','reset'} 214f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCallstatic void ParseAlignPragma(Sema &Actions, Preprocessor &PP, Token &FirstTok, 215cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar bool IsOptions) { 216861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar Token Tok; 217cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar 218cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar if (IsOptions) { 219cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar PP.Lex(Tok); 220cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar if (Tok.isNot(tok::identifier) || 221cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar !Tok.getIdentifierInfo()->isStr("align")) { 222cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar PP.Diag(Tok.getLocation(), diag::warn_pragma_options_expected_align); 223cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar return; 224cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar } 225861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar } 226638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar 227861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar PP.Lex(Tok); 228861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar if (Tok.isNot(tok::equal)) { 229cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar PP.Diag(Tok.getLocation(), diag::warn_pragma_align_expected_equal) 230cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar << IsOptions; 231861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar return; 232861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar } 233861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar 234861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar PP.Lex(Tok); 235861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar if (Tok.isNot(tok::identifier)) { 236861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) 237cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar << (IsOptions ? "options" : "align"); 238861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar return; 239861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar } 240861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar 241f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Sema::PragmaOptionsAlignKind Kind = Sema::POAK_Natural; 242861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar const IdentifierInfo *II = Tok.getIdentifierInfo(); 243638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar if (II->isStr("native")) 244f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Native; 245638e7cf3a09436dce7f3150ff8e4f27d190bd2edDaniel Dunbar else if (II->isStr("natural")) 246f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Natural; 2476f739145b94ede1ca98b5a5e0e179c817c405d7bDaniel Dunbar else if (II->isStr("packed")) 248f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Packed; 249861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar else if (II->isStr("power")) 250f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Power; 251861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar else if (II->isStr("mac68k")) 252f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Mac68k; 253861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar else if (II->isStr("reset")) 254f312b1ea179f1c44371f9ee0cd0bc006f612de11John McCall Kind = Sema::POAK_Reset; 255861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar else { 256cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar PP.Diag(Tok.getLocation(), diag::warn_pragma_align_invalid_option) 257cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar << IsOptions; 258861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar return; 259861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar } 260861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar 261861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar SourceLocation KindLoc = Tok.getLocation(); 262861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar PP.Lex(Tok); 26384021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne if (Tok.isNot(tok::eod)) { 264861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) 265cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar << (IsOptions ? "options" : "align"); 266861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar return; 267861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar } 268861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar 269cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar Actions.ActOnPragmaOptionsAlign(Kind, FirstTok.getLocation(), KindLoc); 270cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar} 271cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar 27280c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaAlignHandler::HandlePragma(Preprocessor &PP, 27380c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor PragmaIntroducerKind Introducer, 27480c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor Token &AlignTok) { 275cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar ParseAlignPragma(Actions, PP, AlignTok, /*IsOptions=*/false); 276cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar} 277cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar 27880c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaOptionsHandler::HandlePragma(Preprocessor &PP, 27980c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor PragmaIntroducerKind Introducer, 28080c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor Token &OptionsTok) { 281cbb98edd530787c2ac019e437e7c599df8004ba7Daniel Dunbar ParseAlignPragma(Actions, PP, OptionsTok, /*IsOptions=*/true); 282861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar} 283861800c676004eabed5927f0552620d06c80a40aDaniel Dunbar 2844726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek// #pragma unused(identifier) 28580c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaUnusedHandler::HandlePragma(Preprocessor &PP, 28680c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor PragmaIntroducerKind Introducer, 28780c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor Token &UnusedTok) { 2884726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek // FIXME: Should we be expanding macros here? My guess is no. 2894726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek SourceLocation UnusedLoc = UnusedTok.getLocation(); 2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2914726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek // Lex the left '('. 2924726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek Token Tok; 2934726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Lex(Tok); 2944726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek if (Tok.isNot(tok::l_paren)) { 2954726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) << "unused"; 2964726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek return; 2974726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 2981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2994726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek // Lex the declaration reference(s). 3007a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek llvm::SmallVector<Token, 5> Identifiers; 3014726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek SourceLocation RParenLoc; 3024726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek bool LexID = true; 3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3044726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek while (true) { 3054726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Lex(Tok); 3061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3074726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek if (LexID) { 3081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (Tok.is(tok::identifier)) { 3097a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek Identifiers.push_back(Tok); 3104726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek LexID = false; 3114726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek continue; 3124726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 3134726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek 3147a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek // Illegal token! 3154726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_var); 3164726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek return; 3174726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 3181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3194726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek // We are execting a ')' or a ','. 3204726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek if (Tok.is(tok::comma)) { 3214726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek LexID = true; 3224726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek continue; 3234726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 3241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3254726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek if (Tok.is(tok::r_paren)) { 3264726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek RParenLoc = Tok.getLocation(); 3274726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek break; 3284726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 3291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3307a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek // Illegal token! 3314726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek PP.Diag(Tok.getLocation(), diag::warn_pragma_unused_expected_punc); 3324726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek return; 3334726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek } 3349991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3359991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Lex(Tok); 33684021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne if (Tok.isNot(tok::eod)) { 3379991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << 3389991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman "unused"; 3399991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman return; 3409991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 3419991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3424726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek // Verify that we have a location for the right parenthesis. 3434726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek assert(RParenLoc.isValid() && "Valid '#pragma unused' must have ')'"); 3447a02a3733cdd2ca672902d869fda4ef2e3f05052Ted Kremenek assert(!Identifiers.empty() && "Valid '#pragma unused' must have arguments"); 3454726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek 346b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis // For each identifier token, insert into the token stream a 347b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis // annot_pragma_unused token followed by the identifier token. 348b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis // This allows us to cache a "#pragma unused" that occurs inside an inline 349b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis // C++ member function. 350b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis 351b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis Token *Toks = new Token[2*Identifiers.size()]; 352b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis for (unsigned i=0; i != Identifiers.size(); i++) { 353b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis Token &pragmaUnusedTok = Toks[2*i], &idTok = Toks[2*i+1]; 354b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis pragmaUnusedTok.startToken(); 355b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis pragmaUnusedTok.setKind(tok::annot_pragma_unused); 356b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis pragmaUnusedTok.setLocation(UnusedLoc); 357b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis idTok = Identifiers[i]; 358b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis } 359b918d0f5d8f147e1e26c34e6cf42a79af2d2ec41Argyrios Kyrtzidis PP.EnterTokenStream(Toks, 2*Identifiers.size(), /*DisableMacroExpansion=*/true, /*OwnsTokens=*/true); 3604726d03ab3abce41911c31d1354a18f1258cae4dTed Kremenek} 3619991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3629991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier 3639991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman// #pragma weak identifier '=' identifier 36480c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregorvoid PragmaWeakHandler::HandlePragma(Preprocessor &PP, 36580c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor PragmaIntroducerKind Introducer, 36680c60f72848896f867f6b7e664e7060d9e78f019Douglas Gregor Token &WeakTok) { 3679991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman // FIXME: Should we be expanding macros here? My guess is no. 3689991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman SourceLocation WeakLoc = WeakTok.getLocation(); 3699991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3709991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman Token Tok; 3719991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Lex(Tok); 3729991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman if (Tok.isNot(tok::identifier)) { 3739991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) << "weak"; 3749991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman return; 3759991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 3769991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3779991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman IdentifierInfo *WeakName = Tok.getIdentifierInfo(), *AliasName = 0; 3789991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman SourceLocation WeakNameLoc = Tok.getLocation(), AliasNameLoc; 3799991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3809991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Lex(Tok); 3819991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman if (Tok.is(tok::equal)) { 3829991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Lex(Tok); 3839991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman if (Tok.isNot(tok::identifier)) { 3841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) 3859991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman << "weak"; 3869991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman return; 3879991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 3889991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman AliasName = Tok.getIdentifierInfo(); 3899991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman AliasNameLoc = Tok.getLocation(); 3909991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Lex(Tok); 3919991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 3929991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 39384021556baceb76eedf7d44be8ba71d9b8cfaccePeter Collingbourne if (Tok.isNot(tok::eod)) { 3949991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) << "weak"; 3959991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman return; 3969991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 3979991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman 3989991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman if (AliasName) { 3999991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman Actions.ActOnPragmaWeakAlias(WeakName, AliasName, WeakLoc, WeakNameLoc, 4009991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman AliasNameLoc); 4019991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } else { 4029991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman Actions.ActOnPragmaWeakID(WeakName, WeakLoc, WeakNameLoc); 4039991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman } 4049991479ad5dde617168cc1e4b18425cdbbfd9fa9Eli Friedman} 405321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne 406321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbournevoid 407321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter CollingbournePragmaFPContractHandler::HandlePragma(Preprocessor &PP, 408321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne PragmaIntroducerKind Introducer, 409321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne Token &Tok) { 410321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne tok::OnOffSwitch OOS; 411321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne if (PP.LexOnOffSwitch(OOS)) 412321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne return; 413321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne 414321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne Actions.ActOnPragmaFPContract(OOS); 415321b8179afaf803dcc56b2a19f7b0891a03c92c8Peter Collingbourne} 416f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 417f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbournevoid 418f315fa81eef1977b3457fd7a7d4639e060fe7278Peter CollingbournePragmaOpenCLExtensionHandler::HandlePragma(Preprocessor &PP, 419f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PragmaIntroducerKind Introducer, 420f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne Token &Tok) { 421b38b6a77ab946ed331f06f6028963d781bac7431Tanya Lattner PP.LexUnexpandedToken(Tok); 422f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne if (Tok.isNot(tok::identifier)) { 423f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) << 424f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne "OPENCL"; 425f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne return; 426f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 427f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne IdentifierInfo *ename = Tok.getIdentifierInfo(); 428f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne SourceLocation NameLoc = Tok.getLocation(); 429f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 430f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Lex(Tok); 431f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne if (Tok.isNot(tok::colon)) { 432f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_colon) << ename; 433f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne return; 434f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 435f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 436f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Lex(Tok); 437f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne if (Tok.isNot(tok::identifier)) { 438f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_enable_disable); 439f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne return; 440f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 441f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne IdentifierInfo *op = Tok.getIdentifierInfo(); 442f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 443f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne unsigned state; 444f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne if (op->isStr("enable")) { 445f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne state = 1; 446f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } else if (op->isStr("disable")) { 447f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne state = 0; 448f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } else { 449f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_enable_disable); 450f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne return; 451f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 452f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 453f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne OpenCLOptions &f = Actions.getOpenCLOptions(); 454f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne if (ename->isStr("all")) { 455f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#define OPENCLEXT(nm) f.nm = state; 456f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#include "clang/Basic/OpenCLExtensions.def" 457f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 458f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#define OPENCLEXT(nm) else if (ename->isStr(#nm)) { f.nm = state; } 459f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne#include "clang/Basic/OpenCLExtensions.def" 460f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne else { 461f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne PP.Diag(NameLoc, diag::warn_pragma_unknown_extension) << ename; 462f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne return; 463f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne } 464f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne} 465f315fa81eef1977b3457fd7a7d4639e060fe7278Peter Collingbourne 466