inline double bar (double arg) { foo (arg); __builtin_return (__builtin_apply ((void (*)()) foo, __builtin_apply_args (), 16)); }
void *foo (void **args) { void *argcookie = &args[1]; __builtin_return (__builtin_apply (args[0], &argcookie, 2 * sizeof (void *))); }
/****************************************************************************** * FunctionName : syslog * Description : compose and queue a new syslog message * Parameters : facility * severity * tag * message * ... * * SYSLOG-MSG = HEADER SP STRUCTURED-DATA [SP MSG] HEADER = PRI VERSION SP TIMESTAMP SP HOSTNAME SP APP-NAME SP PROCID SP MSGID PRI = "<" PRIVAL ">" PRIVAL = 1*3DIGIT ; range 0 .. 191 VERSION = NONZERO-DIGIT 0*2DIGIT HOSTNAME = NILVALUE / 1*255PRINTUSASCII APP-NAME = NILVALUE / 1*48PRINTUSASCII PROCID = NILVALUE / 1*128PRINTUSASCII MSGID = NILVALUE / 1*32PRINTUSASCII TIMESTAMP = NILVALUE / FULL-DATE "T" FULL-TIME FULL-DATE = DATE-FULLYEAR "-" DATE-MONTH "-" DATE-MDAY DATE-FULLYEAR = 4DIGIT DATE-MONTH = 2DIGIT ; 01-12 DATE-MDAY = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on ; month/year FULL-TIME = PARTIAL-TIME TIME-OFFSET PARTIAL-TIME = TIME-HOUR ":" TIME-MINUTE ":" TIME-SECOND [TIME-SECFRAC] TIME-HOUR = 2DIGIT ; 00-23 TIME-MINUTE = 2DIGIT ; 00-59 TIME-SECOND = 2DIGIT ; 00-59 TIME-SECFRAC = "." 1*6DIGIT TIME-OFFSET = "Z" / TIME-NUMOFFSET TIME-NUMOFFSET = ("+" / "-") TIME-HOUR ":" TIME-MINUTE STRUCTURED-DATA = NILVALUE / 1*SD-ELEMENT SD-ELEMENT = "[" SD-ID *(SP SD-PARAM) "]" SD-PARAM = PARAM-NAME "=" %d34 PARAM-VALUE %d34 SD-ID = SD-NAME PARAM-NAME = SD-NAME PARAM-VALUE = UTF-8-STRING ; characters '"', '\' and ; ']' MUST be escaped. SD-NAME = 1*32PRINTUSASCII ; except '=', SP, ']', %d34 (") MSG = MSG-ANY / MSG-UTF8 MSG-ANY = *OCTET ; not starting with BOM MSG-UTF8 = BOM UTF-8-STRING BOM = %xEF.BB.BF UTF-8-STRING = *OCTET ; UTF-8 string as specified ; in RFC 3629 OCTET = %d00-255 SP = %d32 PRINTUSASCII = %d33-126 NONZERO-DIGIT = %d49-57 DIGIT = %d48 / NONZERO-DIGIT NILVALUE = "-" * * TIMESTAMP: realtime_clock == 0 ? timertick / 10⁶ : realtime_clock * HOSTNAME hostname * APPNAME: ems-esp-link * PROCID: timertick * MSGID: NILVALUE * * Returns : none *******************************************************************************/ void ICACHE_FLASH_ATTR syslog(uint8_t facility, uint8_t severity, const char *tag, const char *fmt, ...) { DBG("syslog: state=%d ", syslogState); if (syslogState == SYSLOG_ERROR || syslogState == SYSLOG_HALTED) return; // compose the syslog message void *arg = __builtin_apply_args(); void *res = __builtin_apply((void*)syslog_compose, arg, 128); syslog_entry_t *se = *(syslog_entry_t **)res; // and append it to the message queue syslog_add_entry(se); if (syslogState == SYSLOG_READY) { syslogState = SYSLOG_SENDING; syslog_send_udp(); } if (syslogState == SYSLOG_NONE) { syslogState = SYSLOG_WAIT; syslog_chk_wifi_stat(); // fire the timer to check the Wifi connection status } }
static void * funcall (char **stringp) { void *args[strlen (*stringp)], **ap = args; void *argcookie = &args[1]; do { /* Evaluate the next token. */ *ap++ = eval (stringp); /* Whitespace is irrelevant. */ while (isspace (**stringp)) ++*stringp; /* Terminate at closing paren or end of line. */ } while (**stringp != '\0' && **stringp != ')'); if (**stringp != '\0') /* Swallow closing paren. */ ++*stringp; if (args[0] == NULL) { static const char unknown[] = "Unknown function\n"; write (1, unknown, sizeof unknown - 1); return NULL; } /* Do it to it. */ __builtin_return (__builtin_apply (args[0], &argcookie, (char *) ap - (char *) &args[1])); }
/***************************************************************************** * FunctionName : syslog * Description : compose and queue a new syslog message * Parameters : facility * severity * tag * message * ... * * SYSLOG-MSG = HEADER SP STRUCTURED-DATA [SP MSG] HEADER = PRI VERSION SP TIMESTAMP SP HOSTNAME SP APP-NAME SP PROCID SP MSGID PRI = "<" PRIVAL ">" PRIVAL = 1*3DIGIT ; range 0 .. 191 VERSION = NONZERO-DIGIT 0*2DIGIT HOSTNAME = NILVALUE / 1*255PRINTUSASCII APP-NAME = NILVALUE / 1*48PRINTUSASCII PROCID = NILVALUE / 1*128PRINTUSASCII MSGID = NILVALUE / 1*32PRINTUSASCII TIMESTAMP = NILVALUE / FULL-DATE "T" FULL-TIME FULL-DATE = DATE-FULLYEAR "-" DATE-MONTH "-" DATE-MDAY DATE-FULLYEAR = 4DIGIT DATE-MONTH = 2DIGIT ; 01-12 DATE-MDAY = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on ; month/year FULL-TIME = PARTIAL-TIME TIME-OFFSET PARTIAL-TIME = TIME-HOUR ":" TIME-MINUTE ":" TIME-SECOND [TIME-SECFRAC] TIME-HOUR = 2DIGIT ; 00-23 TIME-MINUTE = 2DIGIT ; 00-59 TIME-SECOND = 2DIGIT ; 00-59 TIME-SECFRAC = "." 1*6DIGIT TIME-OFFSET = "Z" / TIME-NUMOFFSET TIME-NUMOFFSET = ("+" / "-") TIME-HOUR ":" TIME-MINUTE STRUCTURED-DATA = NILVALUE / 1*SD-ELEMENT SD-ELEMENT = "[" SD-ID *(SP SD-PARAM) "]" SD-PARAM = PARAM-NAME "=" %d34 PARAM-VALUE %d34 SD-ID = SD-NAME PARAM-NAME = SD-NAME PARAM-VALUE = UTF-8-STRING ; characters '"', '\' and ; ']' MUST be escaped. SD-NAME = 1*32PRINTUSASCII ; except '=', SP, ']', %d34 (") MSG = MSG-ANY / MSG-UTF8 MSG-ANY = *OCTET ; not starting with BOM MSG-UTF8 = BOM UTF-8-STRING BOM = %xEF.BB.BF UTF-8-STRING = *OCTET ; UTF-8 string as specified ; in RFC 3629 OCTET = %d00-255 SP = %d32 PRINTUSASCII = %d33-126 NONZERO-DIGIT = %d49-57 DIGIT = %d48 / NONZERO-DIGIT NILVALUE = "-" * * TIMESTAMP: realtime_clock == 0 ? timertick / 10⁶ : realtime_clock * HOSTNAME hostname * APPNAME: ems-esp-link * PROCID: timertick * MSGID: NILVALUE * * Returns : none *******************************************************************************/ void ICACHE_FLASH_ATTR syslog(uint8_t facility, uint8_t severity, const char *tag, const char *fmt, ...) { DBG("[%dµs] %s status: %s\n", WDEV_NOW(), __FUNCTION__, syslog_get_status()); if (syslogState == SYSLOG_ERROR || syslogState == SYSLOG_HALTED || flashConfig.syslog_host[0] == '\0') return; if (severity > flashConfig.syslog_filter) return; // compose the syslog message void *arg = __builtin_apply_args(); void *res = __builtin_apply((void*)syslog_compose, arg, 128); if (res == NULL) return; // compose failed, probably due to malloc failure syslog_entry_t *se = *(syslog_entry_t **)res; // and append it to the message queue syslog_add_entry(se); if (syslogState == SYSLOG_NONE) syslog_set_status(SYSLOG_WAIT); if (! syslog_timer_armed) syslog_chk_status(); }
int foo3 (void) /* { dg-warning "stack usage might be \[0-9\]* bytes" } */ { char arr[1024] __attribute__((aligned (512))); arr[0] = 1; /* Force dynamic realignment of argument pointer. */ __builtin_apply ((void (*)()) foo2, 0, 0); return 0; }
// gcc very specific stuff here... void csgl_call_call() { void* data = __builtin_apply_args(); struct CALLINFO info; if(source == NULL) csgl_assert_throw("csgl_call not properly initialized..."); info = source(); if(info.function == NULL) csgl_assert_throw("csgl_call_call(): function = NULL"); // I think it's ok to cast to a __cdecl considering // the call in C# is considered as a __stdcall // this function is declared with 0 param // the underlying function is __stdcall to... __builtin_return( __builtin_apply((void (*)())info.function, data, info.stacksize) ); }
static void * bar (char x) { void *args = __builtin_apply_args (); return __builtin_apply ((fnp) foo, args, sizeof (void *)); }
void data_call(__unused int whatever, ...) { if(!setjmp(call_jmp)) { __builtin_return(__builtin_apply(call_func, __builtin_apply_args(), 32)); } }
void f() { __builtin_apply(0, 0, 0); }
void bar(char *name, ...) { __builtin_apply(foo, __builtin_apply_args(), 64); }
void bar(int arg) { foo(arg); __builtin_apply(foo, __builtin_apply_args(), 16); }
void bar(char *name, ...) { __builtin_apply(foo, __builtin_apply_args(), STACK_ARGUMENTS_SIZE); }
int bar(int n) { __builtin_return(__builtin_apply((void (*)(void))foo, __builtin_apply_args(), STACK_ARGUMENTS_SIZE)); }
int bar(int n) { __builtin_return(__builtin_apply((void (*)(void))foo, __builtin_apply_args(), 64)); }