[llvm-dev] How to know the sub-class of a Value class?
Joshua Cranmer 🐧 via llvm-dev
llvm-dev at lists.llvm.org
Sun Jun 11 23:34:21 PDT 2017
On 6/12/17 1:09 AM, Dipanjan Das via llvm-dev wrote:
> On 11 June 2017 at 23:03, Craig Topper <craig.topper at gmail.com
> <mailto:craig.topper at gmail.com>> wrote:
> Try value->dump() assuming you're using a debug build.
> The information displayed is non-uniform. There are two different
> cases based on my sample program:
> (1) dump() shows the Type and *some* value which I don't
> understand what it is
> (2) dump() shows the instruction that creates the Value*
> But, it doesn't display the concrete sub-class.
The LLVM class names are largely one-to-one with the instructions
defined in the LLVM Language Reference. The main exception is the class
of operators that get bundled into the BinaryOperator class (e.g., add,
or, xor, fadd, etc.), and BinaryOperator is one of those classes that
Doxygen completely chokes on since it's so macro-heavy. Browsing the
subclass list of llvm::Instruction on Doxygen for something that looks
like the name of the instruction in question.
The other main set of values are the constants. In the dump output,
constant scalars (such as ConstantFP, ConstantInt, ConstantPointerNull)
show up as <type> <val>, e.g., i64 0 or double 0.0. The
ConstantAggregateZero class shows up as zeroinitializer, and
ConstantExprs show up as something like trunc (<expr> to <ty>). Again,
you can read the language manual to see examples, it's usually pretty
clear what type something is.
If you're dead set on actually printing the name of the class of a
Value, there's no canned method to do that. Something like this code
would work (untested):
const char *kind_name = nullptr;
#define HANDLE_VALUE(name) case Value::name##Val: kind_name = #name; break;
default: kind_name = "well this was unexpected";
Thunderbird and DXR developer
Source code archæologist
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the llvm-dev