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关键字有什么作用?

感谢任何帮助。

据我所知,它什么都不做,除非你使用位置编码的操作数(你不应该使用它)。


跟着我去代码潜水:

https://github.com/llvm-mirror/llvm/blob/8ff4fe417f7993462cf4e16a0eb43b09bc26ad36/lib/TableGen/TGParser.cpp#L1707

第 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!");
}

https://github.com/llvm-mirror/llvm/blob/8ff4fe417f7993462cf4e16a0eb43b09bc26ad36/lib/TableGen/Record.cpp#L1583

RecordVal 初始化TyAndPrefix,一对(type, bool)。 bool 存储声明中是否使用了 field 前缀。使用 RecordVal::getPrefix.

查询 field 是否存在

https://github.com/llvm-mirror/llvm/search?utf8=%E2%9C%93&q=getPrefix+path%3Autils%2FTableGen+path%3Alib%2FTableGen&type=Code

除了存在 field 禁止处理位置编码操作数之外,此搜索没有任何用处。