mirror of
git://repo.or.cz/tinycc.git
synced 2026-06-30 00:28:42 +08:00
Remove Windows ARM64 temp-exe fallback
This commit is contained in:
parent
4371ebd682
commit
c24d95db09
@ -175,11 +175,6 @@ In a script, it gives the following header:
|
|||||||
@example
|
@example
|
||||||
#!/usr/local/bin/tcc -run -L/usr/X11R6/lib -lX11
|
#!/usr/local/bin/tcc -run -L/usr/X11R6/lib -lX11
|
||||||
@end example
|
@end example
|
||||||
On native Windows ARM64 builds, CLI @option{-run} currently uses a
|
|
||||||
temporary executable for ordinary runs as a compatibility workaround.
|
|
||||||
@code{libtcc} @code{tcc_run()} remains in-process, and CLI keeps the
|
|
||||||
in-process path for @option{-dt} and @option{-rstdin}.
|
|
||||||
|
|
||||||
@item -v
|
@item -v
|
||||||
Display TCC version.
|
Display TCC version.
|
||||||
|
|
||||||
|
|||||||
129
tcc.c
129
tcc.c
@ -23,9 +23,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "tcc.h"
|
#include "tcc.h"
|
||||||
#if defined(TCC_IS_NATIVE) && defined(_WIN32) && defined(__aarch64__)
|
|
||||||
# include <process.h>
|
|
||||||
#endif
|
|
||||||
#if ONE_SOURCE
|
#if ONE_SOURCE
|
||||||
# include "libtcc.c"
|
# include "libtcc.c"
|
||||||
#endif
|
#endif
|
||||||
@ -319,125 +316,6 @@ static unsigned getclock_ms(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TCC_IS_NATIVE) && defined(_WIN32) && defined(__aarch64__)
|
|
||||||
static char *tcc_append_windows_arg(char *dst, const char *arg)
|
|
||||||
{
|
|
||||||
const char *p = arg;
|
|
||||||
int quote = *arg == '\0' || strpbrk(arg, " \t\"") != NULL;
|
|
||||||
|
|
||||||
if (quote)
|
|
||||||
*dst++ = '"';
|
|
||||||
for (;;) {
|
|
||||||
int bs = 0;
|
|
||||||
while (*p == '\\')
|
|
||||||
++bs, ++p;
|
|
||||||
if (*p == '\0') {
|
|
||||||
if (quote)
|
|
||||||
while (bs--)
|
|
||||||
*dst++ = '\\', *dst++ = '\\';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (*p == '"') {
|
|
||||||
while (bs--)
|
|
||||||
*dst++ = '\\', *dst++ = '\\';
|
|
||||||
*dst++ = '\\';
|
|
||||||
} else {
|
|
||||||
while (bs--)
|
|
||||||
*dst++ = '\\';
|
|
||||||
}
|
|
||||||
*dst++ = *p++;
|
|
||||||
}
|
|
||||||
if (quote)
|
|
||||||
*dst++ = '"';
|
|
||||||
return dst;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tcc_run_via_temp_exe(TCCState *s, int argc, char **argv)
|
|
||||||
{
|
|
||||||
char tmpdir[MAX_PATH], tmppath[MAX_PATH];
|
|
||||||
PROCESS_INFORMATION pi;
|
|
||||||
STARTUPINFOA si;
|
|
||||||
DWORD exit_code;
|
|
||||||
char *cmdline = NULL, *p;
|
|
||||||
char *saved_outfile, *tmp_outfile;
|
|
||||||
int saved_output_type, ret, i;
|
|
||||||
size_t len;
|
|
||||||
TCCState *s1 = s;
|
|
||||||
|
|
||||||
if (!GetTempPathA(sizeof tmpdir, tmpdir))
|
|
||||||
return tcc_error_noabort("could not get temp directory"), -1;
|
|
||||||
if (!GetTempFileNameA(tmpdir, "tcc", 0, tmppath))
|
|
||||||
return tcc_error_noabort("could not create temp file name"), -1;
|
|
||||||
|
|
||||||
saved_outfile = s->outfile;
|
|
||||||
saved_output_type = s->output_type;
|
|
||||||
tmp_outfile = tcc_strdup(tmppath);
|
|
||||||
if (!tmp_outfile)
|
|
||||||
return -1;
|
|
||||||
s->outfile = tmp_outfile;
|
|
||||||
s->output_type = TCC_OUTPUT_EXE;
|
|
||||||
|
|
||||||
ret = tcc_output_file(s, s->outfile);
|
|
||||||
s->output_type = saved_output_type;
|
|
||||||
s->outfile = saved_outfile;
|
|
||||||
if (ret < 0) {
|
|
||||||
tcc_free(tmp_outfile);
|
|
||||||
DeleteFileA(tmppath);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = 1;
|
|
||||||
for (i = 0; i < argc; ++i)
|
|
||||||
len += strlen(argv[i]) * 2 + 3;
|
|
||||||
if (argc == 0)
|
|
||||||
len += strlen(tmppath) * 2 + 3;
|
|
||||||
cmdline = tcc_malloc(len);
|
|
||||||
if (!cmdline) {
|
|
||||||
tcc_free(tmp_outfile);
|
|
||||||
DeleteFileA(tmppath);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
p = cmdline;
|
|
||||||
p = tcc_append_windows_arg(p, argc > 0 ? argv[0] : tmppath);
|
|
||||||
for (i = 1; i < argc; ++i) {
|
|
||||||
*p++ = ' ';
|
|
||||||
p = tcc_append_windows_arg(p, argv[i]);
|
|
||||||
}
|
|
||||||
*p = '\0';
|
|
||||||
|
|
||||||
memset(&si, 0, sizeof(si));
|
|
||||||
memset(&pi, 0, sizeof(pi));
|
|
||||||
si.cb = sizeof(si);
|
|
||||||
SetLastError(0);
|
|
||||||
ret = CreateProcessA(tmppath, cmdline, NULL, NULL, TRUE, 0,
|
|
||||||
NULL, NULL, &si, &pi);
|
|
||||||
if (!ret) {
|
|
||||||
tcc_error_noabort("could not run '%s'", tmppath);
|
|
||||||
ret = 1;
|
|
||||||
} else {
|
|
||||||
WaitForSingleObject(pi.hProcess, INFINITE);
|
|
||||||
if (!GetExitCodeProcess(pi.hProcess, &exit_code))
|
|
||||||
exit_code = 1;
|
|
||||||
CloseHandle(pi.hThread);
|
|
||||||
CloseHandle(pi.hProcess);
|
|
||||||
ret = (int)exit_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
tcc_free(cmdline);
|
|
||||||
tcc_free(tmp_outfile);
|
|
||||||
DeleteFileA(tmppath);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int tcc_run_requires_inprocess(const TCCState *s)
|
|
||||||
{
|
|
||||||
/* Temporary Windows ARM64 workaround: keep the generic in-process path
|
|
||||||
where CLI features rely on it, but run ordinary `tcc -run` through a
|
|
||||||
child process until the native runtime path is fully equivalent. */
|
|
||||||
return (s->dflag & 16) || s->run_stdin != NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
TCCState *s, *s1;
|
TCCState *s, *s1;
|
||||||
@ -548,14 +426,7 @@ redo:
|
|||||||
} else if (0 == ret) {
|
} else if (0 == ret) {
|
||||||
if (s->output_type == TCC_OUTPUT_MEMORY) {
|
if (s->output_type == TCC_OUTPUT_MEMORY) {
|
||||||
#ifdef TCC_IS_NATIVE
|
#ifdef TCC_IS_NATIVE
|
||||||
#if defined(_WIN32) && defined(__aarch64__)
|
|
||||||
if (tcc_run_requires_inprocess(s))
|
|
||||||
ret = tcc_run(s, argc, argv);
|
|
||||||
else
|
|
||||||
ret = tcc_run_via_temp_exe(s, argc, argv);
|
|
||||||
#else
|
|
||||||
ret = tcc_run(s, argc, argv);
|
ret = tcc_run(s, argc, argv);
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
if (!s->outfile)
|
if (!s->outfile)
|
||||||
|
|||||||
2
tccrun.c
2
tccrun.c
@ -1522,7 +1522,6 @@ static void rt_restore_context_from_jmpbuf(void *p_jmp_buf, int code)
|
|||||||
static long __stdcall cpu_exception_handler(EXCEPTION_POINTERS *ex_info)
|
static long __stdcall cpu_exception_handler(EXCEPTION_POINTERS *ex_info)
|
||||||
{
|
{
|
||||||
rt_frame f;
|
rt_frame f;
|
||||||
TCCState *s;
|
|
||||||
unsigned code;
|
unsigned code;
|
||||||
rt_getcontext(ex_info->ContextRecord, &f);
|
rt_getcontext(ex_info->ContextRecord, &f);
|
||||||
|
|
||||||
@ -1546,6 +1545,7 @@ static long __stdcall cpu_exception_handler(EXCEPTION_POINTERS *ex_info)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if defined(_WIN64) && defined(__aarch64__) && !defined(CONFIG_TCC_BACKTRACE_ONLY)
|
#if defined(_WIN64) && defined(__aarch64__) && !defined(CONFIG_TCC_BACKTRACE_ONLY)
|
||||||
|
TCCState *s;
|
||||||
rt_wait_sem();
|
rt_wait_sem();
|
||||||
s = rt_find_state(&f);
|
s = rt_find_state(&f);
|
||||||
rt_post_sem();
|
rt_post_sem();
|
||||||
|
|||||||
@ -338,7 +338,11 @@ int main(int argc, char **argv)
|
|||||||
#else
|
#else
|
||||||
#include <tcclib.h>
|
#include <tcclib.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
void __stdcall Sleep(unsigned int milliseconds);
|
||||||
|
#else
|
||||||
unsigned int sleep(unsigned int seconds);
|
unsigned int sleep(unsigned int seconds);
|
||||||
|
#endif
|
||||||
|
|
||||||
int fib(n)
|
int fib(n)
|
||||||
{
|
{
|
||||||
@ -347,7 +351,11 @@ int fib(n)
|
|||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
Sleep(1000);
|
||||||
|
#else
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
#endif
|
||||||
printf(" %d", fib(atoi(argv[1])));
|
printf(" %d", fib(atoi(argv[1])));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user