LLVM tablegen中field关键字的含义是什么?

fla*_*urn 3 llvm

我正在尝试学习LLVM tablegen.http://llvm.org/docs/TableGen/LangRef.html显示该field关键字存在但未解释其含义.有谁知道这意味着什么?

我在教程中找到了以下代码

class Cpu0Reg<string n> : Register<n> {
  field bits<4> Num;
  let Namespace = "Cpu0";
}
Run Code Online (Sandbox Code Playgroud)

我可以改为执行以下操作(注意field缺少关键字)

class Cpu0Reg<string n> : Register<n> {
  bits<4> Num;
  let Namespace = "Cpu0";
}
Run Code Online (Sandbox Code Playgroud)

在本教程的后面我找到了这段代码(请注意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";
}
Run Code Online (Sandbox Code Playgroud)

那么究竟是什么之间的区别field bits<n>,并bits<n>和什么field关键词呢?

任何帮助表示赞赏.

Che*_*Sun 6

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


在我去代码潜水时关注我:

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

第1691行的评论表明这field是可选的.

请注意,第1696-1697行的目的是简单地删除field令牌(如果存在).field在变量中也记录了存在,该变量HasField被传递到第RecordVal1722行的构造函数中.

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

RecordVal初始化TyAndPrefix,一对(类型,布尔).bool存储是否field在声明中使用了前缀.field查询的存在使用RecordVal::getPrefix.

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

除了存在field对位置编码的操作数的禁止处理之外,该搜索没有用处.