blob: 4dce7f2244ba13a8c3832917dbe15f280459f2ab [file] [log] [blame]
Shih-wei Liao462aefd2010-06-04 15:32:04 -07001#include "slang_pragma_recorder.hpp"
2
Shih-wei Liao9ef2f782010-10-01 12:31:37 -07003#include "clang/Lex/Token.h"
Shih-wei Liao462aefd2010-06-04 15:32:04 -07004
Shih-wei Liao9ef2f782010-10-01 12:31:37 -07005#include "clang/Basic/TokenKinds.h"
Shih-wei Liao462aefd2010-06-04 15:32:04 -07006
Shih-wei Liao9ef2f782010-10-01 12:31:37 -07007#include "clang/Lex/Preprocessor.h"
Shih-wei Liao462aefd2010-06-04 15:32:04 -07008
Shih-wei Liao9ef2f782010-10-01 12:31:37 -07009using namespace slang;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070010
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070011bool PragmaRecorder::GetPragmaNameFromToken(const clang::Token &Token,
12 std::string &PragmaName) {
13 if (Token.isLiteral())
14 PragmaName.assign(Token.getLiteralData(), Token.getLength());
15 else if (Token.is(clang::tok::identifier))
16 PragmaName.assign(Token.getIdentifierInfo()->getNameStart(),
17 Token.getIdentifierInfo()->getLength());
18 else
19 return false;
20 return true;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070021}
22
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070023bool PragmaRecorder::GetPragmaValueFromToken(const clang::Token &Token,
24 std::string &PragmaValue) {
25 // Same as the GetPragmaName()
26 if(Token.is(clang::tok::r_paren))
27 PragmaValue.clear();
28 else
29 return GetPragmaNameFromToken(Token, PragmaValue);
30 return true;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070031}
32
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070033PragmaRecorder::PragmaRecorder(PragmaList &Pragmas) :
Shih-wei Liao1ebc0ca2010-09-14 10:57:21 -070034 PragmaHandler(),
35 mPragmas(Pragmas) {
36 return;
37}
Shih-wei Liao462aefd2010-06-04 15:32:04 -070038
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070039void PragmaRecorder::HandlePragma(clang::Preprocessor &PP,
40 clang::Token &FirstToken) {
41 clang::Token &CurrentToken = FirstToken;
42 std::string PragmaName, PragmaValue = "";
43 // Pragma in ACC should be a name/value pair
Shih-wei Liao462aefd2010-06-04 15:32:04 -070044
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070045 if (GetPragmaNameFromToken(FirstToken, PragmaName)) {
46 // start parsing the value '(' PragmaValue ')'
47 const clang::Token* NextToken = &PP.LookAhead(0);
Shih-wei Liao462aefd2010-06-04 15:32:04 -070048
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070049 if (NextToken->is(clang::tok::l_paren))
50 PP.LexUnexpandedToken(CurrentToken);
51 else
52 goto end_parsing_pragma_value;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070053
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070054 NextToken = &PP.LookAhead(0);
55 if (GetPragmaValueFromToken(*NextToken, PragmaValue))
56 PP.Lex(CurrentToken);
57 else
58 goto end_parsing_pragma_value;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070059
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070060 if (!NextToken->is(clang::tok::r_paren)) {
61 NextToken = &PP.LookAhead(0);
62 if (NextToken->is(clang::tok::r_paren))
63 PP.LexUnexpandedToken(CurrentToken);
64 else
65 goto end_parsing_pragma_value;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070066 }
67
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070068 // Until now, we ensure that we have a pragma name/value pair
69 mPragmas.push_back( make_pair(PragmaName, PragmaValue) );
70 }
71
Shih-wei Liao462aefd2010-06-04 15:32:04 -070072end_parsing_pragma_value:
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070073 // Infor lex to eat the token
74 PP.LexUnexpandedToken(CurrentToken);
Shih-wei Liao462aefd2010-06-04 15:32:04 -070075
Shih-wei Liao9ef2f782010-10-01 12:31:37 -070076 return;
Shih-wei Liao462aefd2010-06-04 15:32:04 -070077}