On 31 March 2017 at 15:06, Dibyendu Majumdar <mobile@xxxxxxxxxxxxxxx> wrote: > On 31 March 2017 at 14:47, Dibyendu Majumdar <mobile@xxxxxxxxxxxxxxx> wrote: >> I am investigating a failure in this test: >> >> #include <stdarg.h> >> #include <stdlib.h> >> #include <stdio.h> >> >> void error_message(const char *fmt, ...) { >> va_list argp; >> va_start(argp, fmt); >> vfprintf(stdout, fmt, argp); >> va_end(argp); >> } >> >> int main(void) >> { >> error_message("%s\n", "hello world"); >> return 0; >> } >> >> >> The linearized output for error_message() is: >> >> rror_message: >> .L0: >> <entry-point> >> store.64 %arg1 -> 0[fmt] >> cast.64 %r2 <- (64) fmt >> load.64 %r3 <- 0[stdout] >> call.32 %r6 <- vfprintf, %r3, %arg1, %r2 >> ret >> >> Above seems incorrect to me, as %r2 should be pointing to [8]fmt presumably? >> > > I think this might be because the macro __builtin_va_start() is being > defined in sparse but this doesn't match what gets defined by gcc? I > see this in sparse: > > #define __builtin_va_start(a,b) ((a) = (__builtin_va_list)(&(b))) > > but if I run above code through gcc then preprocessed output says: > > __builtin_va_start(argp, fmt); > And it also seems that LLVM provides special instructions and intrinsics for variable argument handling: http://llvm.org/docs/LangRef.html#int-varargs I don't know how to fix this issue as it appears that there is OP_VAARG instruction in sparse but this is not implemented/output? Thanks and Regards Dibyendu -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html