[llvm-dev] tablegen dag syntax question
Nicolai Hähnle via llvm-dev
llvm-dev at lists.llvm.org
Sat Apr 27 02:58:08 PDT 2019
On 27.04.19 01:39, Chris Sears via llvm-dev wrote:
> What is the difference between these two fragments (taken from two
> different tblgen record dumps)?
> dag OutOperandList = (outs GPR:$rd);
> dag OutOperandList = (outs R2);
> The first is from the RISCV backend record dump. There will be a
> substitution at some point for $rd. In the second, I'm specifying R2, no
> substitution necessary.
> If I specify GPR64:R2 or i64:R2 in my Instruction def, rather than just
> R2, tblgen complains:
> error: expected variable name in dag literal
This is because the syntax for dag operands is <value>:$name, where both
parts are optional, and your attempt to use a TableGen value in place of
the name makes no sense.
The value is typically a TableGen record (something that was created
with a `def`), though in contexts other than the OutOperandList it could
also be an integer, as you often see in ISel patterns.
The name is simply a symbolic name that has no meaning in the TableGen
language itself, but is interpreted by the TableGen backend in order to
link various parts of the instruction definition together. For example,
the names in the OutOperandList are linked to the names mentioned in the
definition of the textual assembly, and this link is used to
automatically generated assembly printer and parser tables and code.
For this reason, operands in the OutOperandList really always need a name.
> If I use R1000 (which isn't defined) I get what I'd expect:
> error: Variable not defined: 'R1000'
> There isn't any documentation (that I could find) for this syntax.
> Consequently, I'm a little worried that using R2 rather than
> something:R2 is somehow wrong.
> Why does the RISCV dag use GPR:$rd rather than just $rd?
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the llvm-dev