cvinclude va_list assignment issue in r12base inline macros
  • Priest of the Order of the Butterfly
    Priest of the Order of the Butterfly
    BSzili
    Posts: 534 from 2012/6/8
    From: Hungary
    There seems to be some inconsistency with how va_list type arguments are handled for r12base library functions. cvinclude.pl generates inlines like you see for fontconfig.library and tiff.library. For example:
    Code:
    #define FcPatternVaBuild(__p0, __p1) \
    ({ \
    FcPattern * __t__p0 = __p0;\
    va_list __t__p1 = __p1;\
    long __base = (long)(FONTCONFIG_BASE_NAME);\
    __asm volatile("mr 12,%0": :"r"(__base):"r12");\
    (((FcPattern *(*)(FcPattern *, va_list ))*(void**)(__base - 934))(__t__p0, __t__p1));\
    })

    Code:
    #define TIFFVGetFieldDefaulted(__p0, __p1, __p2) \
    ({ \
    TIFF * __t__p0 = __p0;\
    ttag_t __t__p1 = __p1;\
    va_list __t__p2 = __p2;\
    long __base = (long)(TIFF_BASE_NAME);\
    __asm volatile("mr 12,%0": :"r"(__base):"r12");\
    (((int (*)(TIFF *, ttag_t , va_list ))*(void**)(__base - 178))(__t__p0, __t__p1, __t__p2));\
    })

    This does work fine with the cross compiler, but with the native compilers the assignments highlighted in bold give an "invalid initializer" error, possible because va_list is some non-POD type there. In sqlite.library this is worked around by using the va_list macro argument directly, without copying it. For example the __p2 argument here:
    Code:
    #define sqlite3_vlog(__p0, __p1, __p2) \
    ({ \
    int __t__p0 = __p0;\
    const char * __t__p1 = __p1;\
    long __base = (long)(SQLITE_BASE_NAME);\
    __asm volatile("mr 12,%0": :"r"(__base):"r12");\
    (((void (*)(int , const char *, va_list ))*(void**)(__base - 1126))(__t__p0, __t__p1, __p2));\
    })

    Which one of this is correct? If copying the va_list argument is necessary, then it can be done with va_copy, which works with both the native and cross-compiler. For example:
    Code:
    va_list __t__p2; \
    va_copy(__t__p2, __p2); \

    It would be nice if cvinclude.pl could be updated to handle this edge case.
    I see the jimmies have been rustled.
  • »24.04.20 - 09:14
    Profile Visit Website
  • MorphOS Developer
    jacadcaps
    Posts: 2015 from 2003/3/5
    From: Canada
    Unfortunately, cvinclude was created in a write-only language and the knowledge on how it works has long been lost. I am afraid there were dragons involved.
  • »01.05.20 - 13:54
    Profile Visit Website
  • Priest of the Order of the Butterfly
    Priest of the Order of the Butterfly
    BSzili
    Posts: 534 from 2012/6/8
    From: Hungary
    I see, no problem. Does the va_list argument has to be copied, or is it enough to just pass it to the library function like sqlite.library macros do?
    I see the jimmies have been rustled.
  • »01.05.20 - 15:59
    Profile Visit Website