diff options
Diffstat (limited to 'llvm/lib/Target')
4 files changed, 26 insertions, 23 deletions
diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp index df225f6ffcc..4eb7bf1b6e5 100644 --- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp @@ -1277,7 +1277,7 @@ bool AMDGPUAsmParser::ParseAMDKernelCodeTValue(StringRef ID, amd_kernel_code_t &Header) { SmallString<40> ErrStr; raw_svector_ostream Err(ErrStr); - if (!parseAmdKernelCodeField(ID, getLexer(), Header, Err)) { + if (!parseAmdKernelCodeField(ID, getParser(), Header, Err)) { return TokError(Err.str()); } Lex(); @@ -1291,9 +1291,6 @@ bool AMDGPUAsmParser::ParseDirectiveAMDKernelCodeT() { while (true) { - if (getLexer().isNot(AsmToken::EndOfStatement)) - return TokError("amd_kernel_code_t values must begin on a new line"); - // Lex EndOfStatement. This is in a while loop, because lexing a comment // will set the current token to EndOfStatement. while(getLexer().is(AsmToken::EndOfStatement)) diff --git a/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTInfo.h b/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTInfo.h index 1aabbb2433c..3a5ff60601d 100644 --- a/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTInfo.h +++ b/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTInfo.h @@ -37,15 +37,15 @@ // have to define these lambdas because of Set/GetMacro #define PRINTCOMP(GetMacro, Shift) \ -[](StringRef Name, const amd_kernel_code_t& C, raw_ostream& OS) { \ +[](StringRef Name, const amd_kernel_code_t &C, raw_ostream &OS) { \ printName(OS, Name) << \ (int)GetMacro(C.compute_pgm_resource_registers >> Shift); \ } #define PARSECOMP(SetMacro, Shift) \ -[](amd_kernel_code_t& C, MCAsmLexer& Lexer, raw_ostream& Err) { \ - if (!expectEqualInt(Lexer, Err)) \ +[](amd_kernel_code_t &C, MCAsmParser &MCParser, raw_ostream &Err) { \ + int64_t Value = 0; \ + if (!expectAbsExpression(MCParser, Value, Err)) \ return false; \ - const uint64_t Value = Lexer.getTok().getIntVal(); \ C.compute_pgm_resource_registers |= SetMacro(Value) << Shift; \ return true; \ } diff --git a/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTUtils.cpp b/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTUtils.cpp index e228092b867..f64973afa44 100644 --- a/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTUtils.cpp +++ b/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTUtils.cpp @@ -16,6 +16,7 @@ #include "AMDKernelCodeTUtils.h" #include "SIDefines.h" #include <llvm/MC/MCParser/MCAsmLexer.h> +#include <llvm/MC/MCParser/MCAsmParser.h> #include <llvm/Support/raw_ostream.h> using namespace llvm; @@ -101,41 +102,45 @@ void llvm::dumpAmdKernelCode(const amd_kernel_code_t *C, // Field parsing -static bool expectEqualInt(MCAsmLexer &Lexer, raw_ostream &Err) { - if (Lexer.isNot(AsmToken::Equal)) { +static bool expectAbsExpression(MCAsmParser &MCParser, int64_t &Value, raw_ostream& Err) { + + if (MCParser.getLexer().isNot(AsmToken::Equal)) { Err << "expected '='"; return false; } - Lexer.Lex(); - if (Lexer.isNot(AsmToken::Integer)) { - Err << "integer literal expected"; + MCParser.getLexer().Lex(); + + if (MCParser.parseAbsoluteExpression(Value)) { + Err << "integer absolute expression expected"; return false; } return true; } template <typename T, T amd_kernel_code_t::*ptr> -static bool parseField(amd_kernel_code_t &C, MCAsmLexer &Lexer, +static bool parseField(amd_kernel_code_t &C, MCAsmParser &MCParser, raw_ostream &Err) { - if (!expectEqualInt(Lexer, Err)) + int64_t Value = 0; + if (!expectAbsExpression(MCParser, Value, Err)) return false; - C.*ptr = (T)Lexer.getTok().getIntVal(); + C.*ptr = (T)Value; return true; } template <typename T, T amd_kernel_code_t::*ptr, int shift, int width = 1> -static bool parseBitField(amd_kernel_code_t &C, MCAsmLexer &Lexer, +static bool parseBitField(amd_kernel_code_t &C, MCAsmParser &MCParser, raw_ostream &Err) { - if (!expectEqualInt(Lexer, Err)) + int64_t Value = 0; + if (!expectAbsExpression(MCParser, Value, Err)) return false; const uint64_t Mask = ((UINT64_C(1) << width) - 1) << shift; C.*ptr &= (T)~Mask; - C.*ptr |= (T)((Lexer.getTok().getIntVal() << shift) & Mask); + C.*ptr |= (T)((Value << shift) & Mask); return true; } typedef bool(*ParseFx)(amd_kernel_code_t &, - MCAsmLexer &Lexer, + MCAsmParser &MCParser, raw_ostream &Err); static ArrayRef<ParseFx> getParserTable() { @@ -148,7 +153,7 @@ static ArrayRef<ParseFx> getParserTable() { } bool llvm::parseAmdKernelCodeField(StringRef ID, - MCAsmLexer &Lexer, + MCAsmParser &MCParser, amd_kernel_code_t &C, raw_ostream &Err) { const int Idx = get_amd_kernel_code_t_FieldIndex(ID); @@ -157,5 +162,5 @@ bool llvm::parseAmdKernelCodeField(StringRef ID, return false; } auto Parser = getParserTable()[Idx]; - return Parser ? Parser(C, Lexer, Err) : false; + return Parser ? Parser(C, MCParser, Err) : false; } diff --git a/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTUtils.h b/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTUtils.h index 61c1a0fc6c0..d9edca7a82a 100644 --- a/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTUtils.h +++ b/llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTUtils.h @@ -17,6 +17,7 @@ namespace llvm { class MCAsmLexer; +class MCAsmParser; class raw_ostream; class StringRef; @@ -29,7 +30,7 @@ void dumpAmdKernelCode(const amd_kernel_code_t *C, const char *tab); bool parseAmdKernelCodeField(StringRef ID, - MCAsmLexer &Lexer, + MCAsmParser &Parser, amd_kernel_code_t &C, raw_ostream &Err); |