構造体と構造体リテラル

構造体実装した。

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するコードにできるんじゃねーの?