Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 1 | #include "slang_pragma_recorder.hpp" |
| 2 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 3 | #include "clang/Lex/Token.h" |
Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 4 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 5 | #include "clang/Basic/TokenKinds.h" |
Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 6 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 7 | #include "clang/Lex/Preprocessor.h" |
Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 8 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 9 | using namespace slang; |
Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 10 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 11 | bool 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 Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 21 | } |
| 22 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 23 | bool 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 Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 31 | } |
| 32 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 33 | PragmaRecorder::PragmaRecorder(PragmaList &Pragmas) : |
Shih-wei Liao | 1ebc0ca | 2010-09-14 10:57:21 -0700 | [diff] [blame] | 34 | PragmaHandler(), |
| 35 | mPragmas(Pragmas) { |
| 36 | return; |
| 37 | } |
Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 38 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 39 | void 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 Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 44 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 45 | if (GetPragmaNameFromToken(FirstToken, PragmaName)) { |
| 46 | // start parsing the value '(' PragmaValue ')' |
| 47 | const clang::Token* NextToken = &PP.LookAhead(0); |
Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 48 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 49 | if (NextToken->is(clang::tok::l_paren)) |
| 50 | PP.LexUnexpandedToken(CurrentToken); |
| 51 | else |
| 52 | goto end_parsing_pragma_value; |
Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 53 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 54 | NextToken = &PP.LookAhead(0); |
| 55 | if (GetPragmaValueFromToken(*NextToken, PragmaValue)) |
| 56 | PP.Lex(CurrentToken); |
| 57 | else |
| 58 | goto end_parsing_pragma_value; |
Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 59 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 60 | 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 Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 66 | } |
| 67 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 68 | // Until now, we ensure that we have a pragma name/value pair |
| 69 | mPragmas.push_back( make_pair(PragmaName, PragmaValue) ); |
| 70 | } |
| 71 | |
Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 72 | end_parsing_pragma_value: |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 73 | // Infor lex to eat the token |
| 74 | PP.LexUnexpandedToken(CurrentToken); |
Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 75 | |
Shih-wei Liao | 9ef2f78 | 2010-10-01 12:31:37 -0700 | [diff] [blame^] | 76 | return; |
Shih-wei Liao | 462aefd | 2010-06-04 15:32:04 -0700 | [diff] [blame] | 77 | } |