1499a5c63SValery Pykhtin //===--------------------AMDKernelCodeTUtils.cpp --------------------------===// 2499a5c63SValery Pykhtin // 3499a5c63SValery Pykhtin // The LLVM Compiler Infrastructure 4499a5c63SValery Pykhtin // 5499a5c63SValery Pykhtin // This file is distributed under the University of Illinois Open Source 6499a5c63SValery Pykhtin // License. See LICENSE.TXT for details. 7499a5c63SValery Pykhtin // 8499a5c63SValery Pykhtin //===----------------------------------------------------------------------===// 9499a5c63SValery Pykhtin // 10499a5c63SValery Pykhtin //===----------------------------------------------------------------------===// 11499a5c63SValery Pykhtin // 12499a5c63SValery Pykhtin /// \file - utility functions to parse/print amd_kernel_code_t structure 13499a5c63SValery Pykhtin // 14499a5c63SValery Pykhtin //===----------------------------------------------------------------------===// 15499a5c63SValery Pykhtin 16499a5c63SValery Pykhtin #include "AMDKernelCodeTUtils.h" 17499a5c63SValery Pykhtin #include "SIDefines.h" 18499a5c63SValery Pykhtin #include <llvm/MC/MCParser/MCAsmLexer.h> 19499a5c63SValery Pykhtin #include <llvm/Support/raw_ostream.h> 20499a5c63SValery Pykhtin 21499a5c63SValery Pykhtin using namespace llvm; 22499a5c63SValery Pykhtin 23499a5c63SValery Pykhtin static ArrayRef<StringRef> get_amd_kernel_code_t_FldNames() { 24499a5c63SValery Pykhtin static StringRef const Table[] = { 25499a5c63SValery Pykhtin "", // not found placeholder 26499a5c63SValery Pykhtin #define RECORD(name, print, parse) #name 27499a5c63SValery Pykhtin #include "AMDKernelCodeTInfo.h" 28499a5c63SValery Pykhtin #undef RECORD 29499a5c63SValery Pykhtin }; 30499a5c63SValery Pykhtin return makeArrayRef(Table); 31499a5c63SValery Pykhtin } 32499a5c63SValery Pykhtin 33499a5c63SValery Pykhtin static StringMap<int> createIndexMap(const ArrayRef<StringRef>& a) { 34499a5c63SValery Pykhtin StringMap<int> map; 35499a5c63SValery Pykhtin for (auto Name : a) 36499a5c63SValery Pykhtin map.insert(std::make_pair(Name, map.size())); 3750cd3c4eSValery Pykhtin return map; 38499a5c63SValery Pykhtin } 39499a5c63SValery Pykhtin 40499a5c63SValery Pykhtin static int get_amd_kernel_code_t_FieldIndex(StringRef name) { 41499a5c63SValery Pykhtin static const auto map = createIndexMap(get_amd_kernel_code_t_FldNames()); 42499a5c63SValery Pykhtin return map.lookup(name) - 1; // returns -1 if not found 43499a5c63SValery Pykhtin } 44499a5c63SValery Pykhtin 45499a5c63SValery Pykhtin static StringRef get_amd_kernel_code_t_FieldName(int index) { 46499a5c63SValery Pykhtin return get_amd_kernel_code_t_FldNames()[index + 1]; 47499a5c63SValery Pykhtin } 48499a5c63SValery Pykhtin 49499a5c63SValery Pykhtin 50499a5c63SValery Pykhtin // Field printing 51499a5c63SValery Pykhtin 52*4fb78518SBenjamin Kramer static raw_ostream &printName(raw_ostream &OS, StringRef Name) { 53499a5c63SValery Pykhtin return OS << Name << " = "; 54499a5c63SValery Pykhtin } 55499a5c63SValery Pykhtin 56499a5c63SValery Pykhtin template <typename T, T amd_kernel_code_t::*ptr> 57*4fb78518SBenjamin Kramer static void printField(StringRef Name, const amd_kernel_code_t &C, 58499a5c63SValery Pykhtin raw_ostream &OS) { 59499a5c63SValery Pykhtin printName(OS, Name) << (int)(C.*ptr); 60499a5c63SValery Pykhtin } 61499a5c63SValery Pykhtin 62499a5c63SValery Pykhtin template <typename T, T amd_kernel_code_t::*ptr, int shift, int width = 1> 63*4fb78518SBenjamin Kramer static void printBitField(StringRef Name, const amd_kernel_code_t &c, 64499a5c63SValery Pykhtin raw_ostream &OS) { 65499a5c63SValery Pykhtin const auto Mask = (static_cast<T>(1) << width) - 1; 66499a5c63SValery Pykhtin printName(OS, Name) << (int)((c.*ptr >> shift) & Mask); 67499a5c63SValery Pykhtin } 68499a5c63SValery Pykhtin 69499a5c63SValery Pykhtin typedef void(*PrintFx)(StringRef, 70499a5c63SValery Pykhtin const amd_kernel_code_t&, 71499a5c63SValery Pykhtin raw_ostream&); 72499a5c63SValery Pykhtin 73499a5c63SValery Pykhtin static ArrayRef<PrintFx> getPrinterTable() { 74499a5c63SValery Pykhtin static const PrintFx Table[] = { 75499a5c63SValery Pykhtin #define RECORD(name, print, parse) print 76499a5c63SValery Pykhtin #include "AMDKernelCodeTInfo.h" 77499a5c63SValery Pykhtin #undef RECORD 78499a5c63SValery Pykhtin }; 79499a5c63SValery Pykhtin return makeArrayRef(Table); 80499a5c63SValery Pykhtin } 81499a5c63SValery Pykhtin 82499a5c63SValery Pykhtin void llvm::printAmdKernelCodeField(const amd_kernel_code_t& C, 83499a5c63SValery Pykhtin int FldIndex, 84499a5c63SValery Pykhtin raw_ostream& OS) { 85499a5c63SValery Pykhtin auto Printer = getPrinterTable()[FldIndex]; 86499a5c63SValery Pykhtin if (Printer) 87499a5c63SValery Pykhtin Printer(get_amd_kernel_code_t_FieldName(FldIndex), C, OS); 88499a5c63SValery Pykhtin } 89499a5c63SValery Pykhtin 90499a5c63SValery Pykhtin void llvm::dumpAmdKernelCode(const amd_kernel_code_t* C, 91499a5c63SValery Pykhtin raw_ostream& OS, 92499a5c63SValery Pykhtin const char* tab) { 93499a5c63SValery Pykhtin const int Size = getPrinterTable().size(); 94499a5c63SValery Pykhtin for (int i = 0; i < Size; ++i) { 95499a5c63SValery Pykhtin OS << tab; 96499a5c63SValery Pykhtin printAmdKernelCodeField(*C, i, OS); 97499a5c63SValery Pykhtin OS << '\n'; 98499a5c63SValery Pykhtin } 99499a5c63SValery Pykhtin } 100499a5c63SValery Pykhtin 101499a5c63SValery Pykhtin 102499a5c63SValery Pykhtin // Field parsing 103499a5c63SValery Pykhtin 104499a5c63SValery Pykhtin static bool expectEqualInt(MCAsmLexer& Lexer, raw_ostream& Err) { 105499a5c63SValery Pykhtin if (Lexer.isNot(AsmToken::Equal)) { 106499a5c63SValery Pykhtin Err << "expected '='"; 107499a5c63SValery Pykhtin return false; 108499a5c63SValery Pykhtin } 109499a5c63SValery Pykhtin Lexer.Lex(); 110499a5c63SValery Pykhtin if (Lexer.isNot(AsmToken::Integer)) { 111499a5c63SValery Pykhtin Err << "integer literal expected"; 112499a5c63SValery Pykhtin return false; 113499a5c63SValery Pykhtin } 114499a5c63SValery Pykhtin return true; 115499a5c63SValery Pykhtin } 116499a5c63SValery Pykhtin 117499a5c63SValery Pykhtin template <typename T, T amd_kernel_code_t::*ptr> 118*4fb78518SBenjamin Kramer static bool parseField(amd_kernel_code_t &C, MCAsmLexer &Lexer, 119499a5c63SValery Pykhtin raw_ostream &Err) { 120499a5c63SValery Pykhtin if (!expectEqualInt(Lexer, Err)) 121499a5c63SValery Pykhtin return false; 122499a5c63SValery Pykhtin C.*ptr = (T)Lexer.getTok().getIntVal(); 123499a5c63SValery Pykhtin return true; 124499a5c63SValery Pykhtin } 125499a5c63SValery Pykhtin 126499a5c63SValery Pykhtin template <typename T, T amd_kernel_code_t::*ptr, int shift, int width = 1> 127*4fb78518SBenjamin Kramer static bool parseBitField(amd_kernel_code_t &C, MCAsmLexer &Lexer, 128499a5c63SValery Pykhtin raw_ostream &Err) { 129499a5c63SValery Pykhtin if (!expectEqualInt(Lexer, Err)) 130499a5c63SValery Pykhtin return false; 131499a5c63SValery Pykhtin const uint64_t Mask = ((UINT64_C(1) << width) - 1) << shift; 132499a5c63SValery Pykhtin C.*ptr &= (T)~Mask; 133499a5c63SValery Pykhtin C.*ptr |= (T)((Lexer.getTok().getIntVal() << shift) & Mask); 134499a5c63SValery Pykhtin return true; 135499a5c63SValery Pykhtin } 136499a5c63SValery Pykhtin 137499a5c63SValery Pykhtin typedef bool(*ParseFx)(amd_kernel_code_t&, 138499a5c63SValery Pykhtin MCAsmLexer& Lexer, 139499a5c63SValery Pykhtin raw_ostream& Err); 140499a5c63SValery Pykhtin 141499a5c63SValery Pykhtin static ArrayRef<ParseFx> getParserTable() { 142499a5c63SValery Pykhtin static const ParseFx Table[] = { 143499a5c63SValery Pykhtin #define RECORD(name, print, parse) parse 144499a5c63SValery Pykhtin #include "AMDKernelCodeTInfo.h" 145499a5c63SValery Pykhtin #undef RECORD 146499a5c63SValery Pykhtin }; 147499a5c63SValery Pykhtin return makeArrayRef(Table); 148499a5c63SValery Pykhtin } 149499a5c63SValery Pykhtin 150499a5c63SValery Pykhtin bool llvm::parseAmdKernelCodeField(StringRef ID, 151499a5c63SValery Pykhtin MCAsmLexer& Lexer, 152499a5c63SValery Pykhtin amd_kernel_code_t& C, 153499a5c63SValery Pykhtin raw_ostream& Err) { 154499a5c63SValery Pykhtin const int Idx = get_amd_kernel_code_t_FieldIndex(ID); 155499a5c63SValery Pykhtin if (Idx < 0) { 156499a5c63SValery Pykhtin Err << "unexpected amd_kernel_code_t field name " << ID; 157499a5c63SValery Pykhtin return false; 158499a5c63SValery Pykhtin } 159499a5c63SValery Pykhtin auto Parser = getParserTable()[Idx]; 160499a5c63SValery Pykhtin return Parser ? Parser(C, Lexer, Err) : false; 161499a5c63SValery Pykhtin } 162