LLVM tablegen中的字段关键字是什么意思?
What is the meaning of field keyword in LLVM tablegen?
我正在尝试学习 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
关键字有什么作用?
感谢任何帮助。
据我所知,它什么都不做,除非你使用位置编码的操作数(你不应该使用它)。
跟着我去代码潜水:
第 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
,一对(type, bool)。 bool 存储声明中是否使用了 field
前缀。使用 RecordVal::getPrefix
.
查询 field
是否存在
除了存在 field
禁止处理位置编码操作数之外,此搜索没有任何用处。
我正在尝试学习 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
关键字有什么作用?
感谢任何帮助。
据我所知,它什么都不做,除非你使用位置编码的操作数(你不应该使用它)。
跟着我去代码潜水:
第 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
,一对(type, bool)。 bool 存储声明中是否使用了 field
前缀。使用 RecordVal::getPrefix
.
field
是否存在
除了存在 field
禁止处理位置编码操作数之外,此搜索没有任何用处。