構造体と構造体リテラル
構造体実装した。
require leaf;
struct Foo {
x: char;
y: short;
z: int;
w: long;
};
fun main(): int
{
var foo = Foo { x = 13@char; y = 75@short; z = 46@int;
w = 2@long; };
0;
}こんなソースが
; ModuleID = 'test'
declare i32 @puti(i32)
declare i32 @putc(i32)
define i32 @main() {
ENTRY:
%cast60 = trunc i32 13 to i8
%cast66 = trunc i32 75 to i16
%cast72 = bitcast i32 46 to i32
%cast78 = sext i32 2 to i64
%mem81_0 = insertvalue { i8, i16, i32, i64 } undef,
i8 %cast60, 0
%mem81_1 = insertvalue { i8, i16, i32, i64 } %mem81_0,
i16 %cast66, 1
%mem81_2 = insertvalue { i8, i16, i32, i64 } %mem81_1,
i32 %cast72, 2
%mem81_3 = insertvalue { i8, i16, i32, i64 } %mem81_2,
i64 %cast78, 3
ret i32 0
}こんな感じになる。
LLVMは構造体(aggregateという)をネイティブで持っているので
こういうのはやりやすい。
%a = insertvalue { i8, i16, i32, i64 } undef, i8 11, 0
%b = insertvalue { i8, i16, i32, i64 } %a, i16 22, 1
%c = insertvalue { i8, i16, i32, i64 } %b, i32 33, 2
%d = insertvalue { i8, i16, i32, i64 } %c, i64 44, 3こんな感じにすれば%dが目的の構造体になるらしい。
このままだと効率悪そうに見えるが、
たぶん大丈夫だろう。
x86のコードは見てないけど(だめじゃん)
ま、機械的にallocaしてstoreするコードにできるんじゃねーの?