構造体と構造体リテラル
構造体実装した。
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するコードにできるんじゃねーの?