Hello all,
I'm trying to understand a bit of LLVM IR syntax. I have a function
definition which looks like this in IR:
define void @foo(%1* ptr) { ...
The C code for foo has a definition that looks like:
typedef struct bar_struct bar;
... Definition of struct bar_struct ...
void foo(bar *ptr) { ...
I can't whittle down a convenient test source file just now; but I'm trying
to understand what the syntax of the 'define' above means -- specifically,
what does it mean for a parameter to have type '%1*'? What is the semantics
here? Inside the body of @foo, there is an SSA variable %1 -- is that
variable related to the %1 in the type of the parameter? (It doesn't seem
to be, which is why I ask.)
I looked in the LLVM Language Reference manual but couldn't find any type
syntax that corresponded to the type I see for foo's parameter. I'm not
sure where else to look, but I'd be happy to hear any pointers.
Any help is appreciated. Thanks in advance.
-Denis
In that context, %1 refers to an unnamed struct; whether %1 refers to
a type or a value is determined by the context. Short example which
should help:
%0 = type { i32, float, float, double }
define i32 @a(%0*) {
entry:
getelementptr %0* %0, i32 0, i32 0
load i32* %1
ret i32 %2
}
-Eli
Okay. Looking back over the IR, I see a type %1 defined at the top of the
module. Thanks!
-Denis
Hello all,
I'm trying to understand a bit of LLVM IR syntax. I have a function
definition which looks like this in IR:
define void @foo(%1* ptr) { ...
The C code for foo has a definition that looks like:
typedef struct bar_struct bar;
... Definition of struct bar_struct ...
void foo(bar *ptr) { ...
I can't whittle down a convenient test source file just now; but I'm trying
to understand what the syntax of the 'define' above means -- specifically,
what does it mean for a parameter to have type '%1*'? What is the semantics
here? Inside the body of @foo, there is an SSA variable %1 -- is that
variable related to the %1 in the type of the parameter? (It doesn't seem
to be, which is why I ask.)
In that context, %1 refers to an unnamed struct; whether %1 refers to
a type or a value is determined by the context. Short example which
should help:
FWIW, I personally regard this as a bug not a feature. It doesn't make
the IR any easier to read.
- Daniel
In that context, %1 refers to an unnamed struct; whether %1 refers to
a type or a value is determined by the context. Short example which
should help:
FWIW, I personally regard this as a bug not a feature. It doesn’t make
the IR any easier to read.
I also find it very confusing. It would be nice if different prefixes were used for names of types and values.
Victor
Why is that? In the IR there are specific places for types and
specific places for values, there is no ambiguity, so why would you
need different prefixes?