diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 10:51:19 +0000 |
commit | eb11fae6d08f479c0799db45860a98af528fa6e7 (patch) | |
tree | 44d492a50c8c1a7eb8e2d17ea3360ec4d066f042 /lib/CodeGen/MIRParser/MILexer.cpp | |
parent | b8a2042aa938069e862750553db0e4d82d25822c (diff) | |
download | src-eb11fae6d08f479c0799db45860a98af528fa6e7.tar.gz src-eb11fae6d08f479c0799db45860a98af528fa6e7.zip |
Vendor import of llvm trunk r338150:vendor/llvm/llvm-trunk-r338150
Notes
Notes:
svn path=/vendor/llvm/dist/; revision=336809
svn path=/vendor/llvm/llvm-trunk-r338150/; revision=336814; tag=vendor/llvm/llvm-trunk-r338150
Diffstat (limited to 'lib/CodeGen/MIRParser/MILexer.cpp')
-rw-r--r-- | lib/CodeGen/MIRParser/MILexer.cpp | 65 |
1 files changed, 38 insertions, 27 deletions
diff --git a/lib/CodeGen/MIRParser/MILexer.cpp b/lib/CodeGen/MIRParser/MILexer.cpp index 6adb7f1288d7..da05c9a22785 100644 --- a/lib/CodeGen/MIRParser/MILexer.cpp +++ b/lib/CodeGen/MIRParser/MILexer.cpp @@ -179,23 +179,6 @@ static Cursor lexName(Cursor C, MIToken &Token, MIToken::TokenKind Type, return C; } -static Cursor maybeLexIntegerOrScalarType(Cursor C, MIToken &Token) { - if ((C.peek() != 'i' && C.peek() != 's' && C.peek() != 'p') || - !isdigit(C.peek(1))) - return None; - char Kind = C.peek(); - auto Range = C; - C.advance(); // Skip 'i', 's', or 'p' - while (isdigit(C.peek())) - C.advance(); - - Token.reset(Kind == 'i' - ? MIToken::IntegerType - : (Kind == 's' ? MIToken::ScalarType : MIToken::PointerType), - Range.upto(C)); - return C; -} - static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { return StringSwitch<MIToken::TokenKind>(Identifier) .Case("_", MIToken::underscore) @@ -211,6 +194,14 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { .Case("renamable", MIToken::kw_renamable) .Case("tied-def", MIToken::kw_tied_def) .Case("frame-setup", MIToken::kw_frame_setup) + .Case("frame-destroy", MIToken::kw_frame_destroy) + .Case("nnan", MIToken::kw_nnan) + .Case("ninf", MIToken::kw_ninf) + .Case("nsz", MIToken::kw_nsz) + .Case("arcp", MIToken::kw_arcp) + .Case("contract", MIToken::kw_contract) + .Case("afn", MIToken::kw_afn) + .Case("reassoc", MIToken::kw_reassoc) .Case("debug-location", MIToken::kw_debug_location) .Case("same_value", MIToken::kw_cfi_same_value) .Case("offset", MIToken::kw_cfi_offset) @@ -241,6 +232,7 @@ static MIToken::TokenKind getIdentifierKind(StringRef Identifier) { .Case("dereferenceable", MIToken::kw_dereferenceable) .Case("invariant", MIToken::kw_invariant) .Case("align", MIToken::kw_align) + .Case("addrspace", MIToken::kw_addrspace) .Case("stack", MIToken::kw_stack) .Case("got", MIToken::kw_got) .Case("jump-table", MIToken::kw_jump_table) @@ -408,17 +400,38 @@ static bool isRegisterChar(char C) { return isIdentifierChar(C) && C != '.'; } -static Cursor maybeLexRegister(Cursor C, MIToken &Token) { - if (C.peek() != '%') +static Cursor lexNamedVirtualRegister(Cursor C, MIToken &Token) { + Cursor Range = C; + C.advance(); // Skip '%' + while (isRegisterChar(C.peek())) + C.advance(); + Token.reset(MIToken::NamedVirtualRegister, Range.upto(C)) + .setStringValue(Range.upto(C).drop_front(1)); // Drop the '%' + return C; +} + +static Cursor maybeLexRegister(Cursor C, MIToken &Token, + ErrorCallbackType ErrorCallback) { + if (C.peek() != '%' && C.peek() != '$') + return None; + + if (C.peek() == '%') { + if (isdigit(C.peek(1))) + return lexVirtualRegister(C, Token); + + if (isRegisterChar(C.peek(1))) + return lexNamedVirtualRegister(C, Token); + return None; - if (isdigit(C.peek(1))) - return lexVirtualRegister(C, Token); + } + + assert(C.peek() == '$'); auto Range = C; - C.advance(); // Skip '%' + C.advance(); // Skip '$' while (isRegisterChar(C.peek())) C.advance(); Token.reset(MIToken::NamedRegister, Range.upto(C)) - .setStringValue(Range.upto(C).drop_front(1)); // Drop the '%' + .setStringValue(Range.upto(C).drop_front(1)); // Drop the '$' return C; } @@ -441,7 +454,7 @@ static Cursor maybeLexGlobalValue(Cursor C, MIToken &Token, static Cursor maybeLexExternalSymbol(Cursor C, MIToken &Token, ErrorCallbackType ErrorCallback) { - if (C.peek() != '$') + if (C.peek() != '&') return None; return lexName(C, Token, MIToken::ExternalSymbol, /*PrefixLength=*/1, ErrorCallback); @@ -620,8 +633,6 @@ StringRef llvm::lexMIToken(StringRef Source, MIToken &Token, return C.remaining(); } - if (Cursor R = maybeLexIntegerOrScalarType(C, Token)) - return R.remaining(); if (Cursor R = maybeLexMachineBasicBlock(C, Token, ErrorCallback)) return R.remaining(); if (Cursor R = maybeLexIdentifier(C, Token)) @@ -640,7 +651,7 @@ StringRef llvm::lexMIToken(StringRef Source, MIToken &Token, return R.remaining(); if (Cursor R = maybeLexIRValue(C, Token, ErrorCallback)) return R.remaining(); - if (Cursor R = maybeLexRegister(C, Token)) + if (Cursor R = maybeLexRegister(C, Token, ErrorCallback)) return R.remaining(); if (Cursor R = maybeLexGlobalValue(C, Token, ErrorCallback)) return R.remaining(); |