Friday, July 1, 2016

va* internals in clang

// notes on clang x86_64 implemention of va* functions (X86ISelLowering.cpp in clang source code base):



// va_list - typedef struct { INT32 gp_offset; INT32  fp_offset; INT8 * overflow_arg_area; INT8 * reg_save_area; } va_list[1];
// va_start() - setups gp_offset, fp_offset, overflow_arg_area, reg_save_area (does not allocate memory)
// va_arg() - see abi x86_64
// va_copy() - just memcpy of this struct (24 bytes)
// va_end() - seems as nop
// so
// 1) it is safe to pass va_list by value
// 2) reg_save_area and overflow_arg_area are allocated from stack in caller

No comments:

Post a Comment