我正在尝试学习LLVM tablegen。 http://llvm.org/docs/TableGen/LangRef.html表示field
关键字存在但未解释其含义。有人知道这意味着什么吗?
我在tutorial
中找到了以下代码class Cpu0Reg<string n> : Register<n> {
field bits<4> Num;
let Namespace = "Cpu0";
}
我可以执行以下操作(请注意缺少field
关键字)
class Cpu0Reg<string n> : Register<n> {
bits<4> Num;
let Namespace = "Cpu0";
}
在本教程的后面我找到了这段代码(注意bits<20> addr
,它前面没有field
个关键字代码:
class FMem<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern,
InstrItinClass itin>: FL<op, outs, ins, asmstr, pattern, itin> {
bits<20> addr;
let Inst{19-16} = addr{19-16};
let Inst{15-0} = addr{15-0};
let DecoderMethod = "DecodeMem";
}
那么field bits<n>
和bits<n>
之间的区别是什么,field
关键字的作用是什么?
感谢任何帮助。
答案 0 :(得分:6)
据我所知,它什么都不做,除非你使用位置编码的操作数(你不应该使用它)。
跟我一起去潜水代码:
第1691行的评论表明field
是可选的。
/// Declaration ::= FIELD? Type ID ('=' Value)?
请注意,这些行的目的是简单地删除field
令牌(如果存在)。
// Read the field prefix if present.
bool HasField = Lex.getCode() == tgtok::Field;
if (HasField) Lex.Lex();
变量field
中也会注明HasField
的存在,并在第1722行传递给RecordVal
的构造函数。
RecordVal::RecordVal(StringRef N, RecTy *T, bool P)
: Name(StringInit::get(N)), TyAndPrefix(T, P) {
Value = UnsetInit::get()->convertInitializerTo(T);
assert(Value && "Cannot create unset value for current type!");
}
RecordVal初始化TyAndPrefix
,一对(类型,布尔)。 bool存储声明中是否使用了field
前缀。使用field
查询是否存在RecordVal::getPrefix
。
除了field
禁止处理位置编码的操作数之外,此搜索没有用处。