summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp5
-rw-r--r--llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTInfo.h8
-rw-r--r--llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTUtils.cpp33
-rw-r--r--llvm/lib/Target/AMDGPU/Utils/AMDKernelCodeTUtils.h3
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);
OpenPOWER on IntegriCloud