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

时间:2015-10-08 18:06:24

标签: llvm

我正在尝试学习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关键字的作用是什么?

感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

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

跟我一起去潜水代码:

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,一对(类型,布尔)。 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禁止处理位置编码的操作数之外,此搜索没有用处。