<div dir="ltr">I think it's possible to modify the example like so, so that it works on x86_64 with very little modification:<div><br></div><div>-----------------</div><div><div>; This struct is different for every platform. For most platforms, it is merely</div><div>; an i8*.</div><div>%struct.va_list = { i8* }</div><div><br></div><div>; For Unix x86_64 platforms, va_list is the following struct:</div><div>; %struct.va_list = type { i32, i32, i8*, i8* }</div><div><br></div><div>define i32 @test(i32 %X, ...) {</div><div>  ; Initialize variable argument processing</div><div>  %ap = alloca %struct.va_list</div><div>  %ap2 = bitcast %struct.va_list* %ap to i8*</div><div>  call void @llvm.va_start(i8* %ap2)</div><div><br></div><div>  ; Read a single integer argument</div><div>  %tmp = va_arg i8* %ap2, i32</div><div><br></div><div>  ; Demonstrate usage of llvm.va_copy and llvm.va_end</div><div>  %aq = alloca i8*</div><div>  %aq2 = bitcast i8** %aq to i8*</div><div>  call void @llvm.va_copy(i8* %aq2, i8* %ap2)</div><div>  call void @llvm.va_end(i8* %aq2)</div><div><br></div><div>  ; Stop processing of arguments.</div><div>  call void @llvm.va_end(i8* %ap2)</div><div>  ret i32 %tmp</div><div>}</div><div><br></div><div>declare void @llvm.va_start(i8*)</div><div>declare void @llvm.va_copy(i8*, i8*)</div><div>declare void @llvm.va_end(i8*)</div></div><div>-----------------<br></div><div><br></div><div>This generates reasonable code, but va_arg still doesn't handle structs as mentioned.</div></div>