[LLVMdev] Target independency using "opaque"? How to do it else?
Johannes Schaub - litb
schaub.johannes at googlemail.com
Wed Apr 6 07:18:41 PDT 2011
Duncan Sands wrote:
> Hi Johannes,
>
>> I'm writing a backend for our scriptlanguage compiler and I'm currently
>> writing an IR module for the runtime library that contains some support
>> routines called by generated code.
>>
>> The IR module contains calls to "malloc", which depend on the size of
>> "size_t". Since I don't know the target when writing the IR module for
>> the runtime library, I thought about using an "opaque" type instance in
>> place of "size_t". When loading the IR module, I would refine the
>> "opaque" to either i64 or i32, depending on which target I'm using.
>
> you can inject a declaration for your own malloc function that always
> takes a 64 bit argument into the bitcode:
> declare i8 *@litb_malloc(i64)
> When you know how big a pointer is on the target you can provide an
> appropriate
> body. For example on a 32 bit machine you could inject:
>
> define i8 *@litb_malloc(i64 %s) {
> %t = trunc i64 %s to i32
> %m = call i8 *@malloc(i32 %t)
> ret i8 *%m
> }
>
> Ciao, Duncan.
Thanks, that makes a lot of sense. And it's small enough to not be a pain in
the ass to inject it programmatically. I'm also using "opaque" in other
places, and I wonder whether that's correct:
%envpad_ty = type opaque
%env_ty = type {
; current save-point
%savepoint_ty*,
; target specific padding
%envpad_ty
}
The above represents the global environment of my scripting runtime, of
which I only access the first member directly from the IR code. I want to
substitute "envpad_ty" with the appropriate array-of-char to fill the size
of one env_ty. Is this the correct way to tackle that?
More information about the llvm-dev
mailing list