Commit d969d02e authored by Alexandre Julliard's avatar Alexandre Julliard

tools: Move target CPU and platform handling to the common tools.h header.

parent c70ed78a
...@@ -80,6 +80,23 @@ ...@@ -80,6 +80,23 @@
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#endif #endif
struct target
{
enum { CPU_i386, CPU_x86_64, CPU_ARM, CPU_ARM64 } cpu;
enum
{
PLATFORM_UNSPECIFIED,
PLATFORM_APPLE,
PLATFORM_ANDROID,
PLATFORM_LINUX,
PLATFORM_FREEBSD,
PLATFORM_SOLARIS,
PLATFORM_WINDOWS,
PLATFORM_MINGW,
PLATFORM_CYGWIN
} platform;
};
static inline void *xmalloc( size_t size ) static inline void *xmalloc( size_t size )
{ {
...@@ -336,6 +353,217 @@ static inline int make_temp_file( const char *prefix, const char *suffix, char * ...@@ -336,6 +353,217 @@ static inline int make_temp_file( const char *prefix, const char *suffix, char *
} }
static inline struct target get_default_target(void)
{
struct target target;
#ifdef __i386__
target.cpu = CPU_i386;
#elif defined(__x86_64__)
target.cpu = CPU_x86_64;
#elif defined(__arm__)
target.cpu = CPU_ARM;
#elif defined(__aarch64__)
target.cpu = CPU_ARM64;
#else
#error Unsupported CPU
#endif
#ifdef __APPLE__
target.platform = PLATFORM_APPLE;
#elif defined(__ANDROID__)
target.platform = PLATFORM_ANDROID;
#elif defined(__linux__)
target.platform = PLATFORM_LINUX;
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
target.platform = PLATFORM_FREEBSD;
#elif defined(__sun)
target.platform = PLATFORM_SOLARIS;
#elif defined(__CYGWIN__)
target.platform = PLATFORM_CYGWIN;
#elif defined(_WIN32)
target.platform = PLATFORM_MINGW;
#else
target.platform = PLATFORM_UNSPECIFIED;
#endif
return target;
}
static inline unsigned int get_target_ptr_size( struct target target )
{
static const unsigned int sizes[] =
{
[CPU_i386] = 4,
[CPU_x86_64] = 8,
[CPU_ARM] = 4,
[CPU_ARM64] = 8,
};
return sizes[target.cpu];
}
static inline void set_target_ptr_size( struct target *target, unsigned int size )
{
switch (target->cpu)
{
case CPU_i386:
if (size == 8) target->cpu = CPU_x86_64;
break;
case CPU_x86_64:
if (size == 4) target->cpu = CPU_i386;
break;
case CPU_ARM:
if (size == 8) target->cpu = CPU_ARM64;
break;
case CPU_ARM64:
if (size == 4) target->cpu = CPU_ARM;
break;
}
}
static inline int get_cpu_from_name( const char *name )
{
static const struct
{
const char *name;
int cpu;
} cpu_names[] =
{
{ "i386", CPU_i386 },
{ "i486", CPU_i386 },
{ "i586", CPU_i386 },
{ "i686", CPU_i386 },
{ "i786", CPU_i386 },
{ "x86_64", CPU_x86_64 },
{ "amd64", CPU_x86_64 },
{ "aarch64", CPU_ARM64 },
{ "arm64", CPU_ARM64 },
{ "arm", CPU_ARM },
};
unsigned int i;
for (i = 0; i < ARRAY_SIZE(cpu_names); i++)
if (!strncmp( cpu_names[i].name, name, strlen(cpu_names[i].name) )) return cpu_names[i].cpu;
return -1;
}
static inline int get_platform_from_name( const char *name )
{
static const struct
{
const char *name;
int platform;
} platform_names[] =
{
{ "macos", PLATFORM_APPLE },
{ "darwin", PLATFORM_APPLE },
{ "android", PLATFORM_ANDROID },
{ "linux", PLATFORM_LINUX },
{ "freebsd", PLATFORM_FREEBSD },
{ "solaris", PLATFORM_SOLARIS },
{ "mingw32", PLATFORM_MINGW },
{ "windows-gnu", PLATFORM_MINGW },
{ "winnt", PLATFORM_MINGW },
{ "windows", PLATFORM_WINDOWS },
{ "cygwin", PLATFORM_CYGWIN },
};
unsigned int i;
for (i = 0; i < ARRAY_SIZE(platform_names); i++)
if (!strncmp( platform_names[i].name, name, strlen(platform_names[i].name) ))
return platform_names[i].platform;
return -1;
};
static inline const char *get_arch_dir( struct target target )
{
static const char *cpu_names[] =
{
[CPU_i386] = "i386",
[CPU_x86_64] = "x86_64",
[CPU_ARM] = "arm",
[CPU_ARM64] = "aarch64"
};
if (!cpu_names[target.cpu]) return "";
switch (target.platform)
{
case PLATFORM_WINDOWS:
case PLATFORM_CYGWIN:
case PLATFORM_MINGW:
return strmake( "/%s-windows", cpu_names[target.cpu] );
default:
return strmake( "/%s-unix", cpu_names[target.cpu] );
}
}
static inline int parse_target( const char *name, struct target *target )
{
int res;
char *p, *spec = xstrdup( name );
/* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */
/* get the CPU part */
if ((p = strchr( spec, '-' )))
{
*p++ = 0;
if ((res = get_cpu_from_name( spec )) == -1)
{
free( spec );
return 0;
}
target->cpu = res;
}
else if (!strcmp( spec, "mingw32" ))
{
target->cpu = CPU_i386;
p = spec;
}
else
{
free( spec );
return 0;
}
/* get the OS part */
target->platform = PLATFORM_UNSPECIFIED; /* default value */
for (;;)
{
if ((res = get_platform_from_name( p )) != -1)
{
target->platform = res;
break;
}
if (!(p = strchr( p, '-' ))) break;
p++;
}
free( spec );
return 1;
}
static inline struct target init_argv0_target( const char *argv0 )
{
char *name = get_basename( argv0 );
struct target target;
if (!strchr( name, '-' ) || !parse_target( name, &target ))
target = get_default_target();
free( name );
return target;
}
/* command-line option parsing */ /* command-line option parsing */
/* partly based on the Glibc getopt() implementation */ /* partly based on the Glibc getopt() implementation */
......
...@@ -92,17 +92,7 @@ static const char usage[] = ...@@ -92,17 +92,7 @@ static const char usage[] =
static const char version_string[] = "Wine IDL Compiler version " PACKAGE_VERSION "\n" static const char version_string[] = "Wine IDL Compiler version " PACKAGE_VERSION "\n"
"Copyright 2002 Ove Kaaven\n"; "Copyright 2002 Ove Kaaven\n";
#ifdef __i386__ static struct target target;
enum target_cpu target_cpu = CPU_x86;
#elif defined(__x86_64__)
enum target_cpu target_cpu = CPU_x86_64;
#elif defined(__arm__)
enum target_cpu target_cpu = CPU_ARM;
#elif defined(__aarch64__)
enum target_cpu target_cpu = CPU_ARM64;
#else
#error Unsupported CPU
#endif
int debuglevel = DEBUGLEVEL_NONE; int debuglevel = DEBUGLEVEL_NONE;
int parser_debug, yy_flex_debug; int parser_debug, yy_flex_debug;
...@@ -210,28 +200,6 @@ static const struct long_option long_options[] = { ...@@ -210,28 +200,6 @@ static const struct long_option long_options[] = {
{ NULL } { NULL }
}; };
static const struct
{
const char *name;
enum target_cpu cpu;
} cpu_names[] =
{
{ "i386", CPU_x86 },
{ "i486", CPU_x86 },
{ "i586", CPU_x86 },
{ "i686", CPU_x86 },
{ "i786", CPU_x86 },
{ "amd64", CPU_x86_64 },
{ "x86_64", CPU_x86_64 },
{ "arm", CPU_ARM },
{ "armv5", CPU_ARM },
{ "armv6", CPU_ARM },
{ "armv7", CPU_ARM },
{ "armv7a", CPU_ARM },
{ "arm64", CPU_ARM64 },
{ "aarch64", CPU_ARM64 },
};
static void rm_tempfile(void); static void rm_tempfile(void);
enum stub_mode get_stub_mode(void) enum stub_mode get_stub_mode(void)
...@@ -288,50 +256,6 @@ static void add_widl_version_define(void) ...@@ -288,50 +256,6 @@ static void add_widl_version_define(void)
wpp_add_cmdline_define(version_str); wpp_add_cmdline_define(version_str);
} }
static void set_cpu( const char *cpu, int error_out )
{
unsigned int i;
for (i = 0; i < ARRAY_SIZE( cpu_names ); i++)
{
if (!strcmp( cpu_names[i].name, cpu ))
{
target_cpu = cpu_names[i].cpu;
return;
}
}
if (error_out)
error( "Unrecognized CPU '%s'\n", cpu );
}
/* Set the target platform based on a potential prefix of the executable name.
* If not found, or not matching a known CPU name, just proceed silently. */
static void init_argv0_target( const char *argv0 )
{
char *p, *name = get_basename( argv0 );
if (!(p = strchr(name, '-')))
{
free( name );
return;
}
*p = 0;
set_cpu( name, 0 );
free( name );
}
/* set the target platform */
static void set_target( const char *target )
{
char *p, *spec = xstrdup( target );
/* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */
if (!(p = strchr( spec, '-' ))) error( "Invalid target specification '%s'\n", target );
*p++ = 0;
set_cpu( spec, 1 );
free( spec );
}
/* clean things up when aborting on a signal */ /* clean things up when aborting on a signal */
static void exit_on_signal( int sig ) static void exit_on_signal( int sig )
{ {
...@@ -648,7 +572,8 @@ static void option_callback( int optc, char *optarg ) ...@@ -648,7 +572,8 @@ static void option_callback( int optc, char *optarg )
/* FIXME: Support robust option */ /* FIXME: Support robust option */
break; break;
case 'b': case 'b':
set_target( optarg ); if (!parse_target( optarg, &target ))
error( "Invalid target specification '%s'\n", optarg );
break; break;
case 'c': case 'c':
do_everything = 0; do_everything = 0;
...@@ -742,22 +667,11 @@ static void option_callback( int optc, char *optarg ) ...@@ -742,22 +667,11 @@ static void option_callback( int optc, char *optarg )
} }
} }
static const char *get_pe_dir(void)
{
switch (target_cpu)
{
case CPU_x86: return "/i386-windows";
case CPU_x86_64: return "/x86_64-windows";
case CPU_ARM: return "/arm-windows";
case CPU_ARM64: return "/aarch64-windows";
default: return "";
}
}
int open_typelib( const char *name ) int open_typelib( const char *name )
{ {
static const char *default_dirs[] = { DLLDIR, "/usr/lib/wine", "/usr/local/lib/wine" }; static const char *default_dirs[] = { DLLDIR, "/usr/lib/wine", "/usr/local/lib/wine" };
const char *pe_dir = get_pe_dir(); struct target win_target = { target.cpu, PLATFORM_WINDOWS };
const char *pe_dir = get_arch_dir( win_target );
int fd; int fd;
unsigned int i; unsigned int i;
...@@ -809,7 +723,7 @@ int main(int argc,char *argv[]) ...@@ -809,7 +723,7 @@ int main(int argc,char *argv[])
signal( SIGHUP, exit_on_signal ); signal( SIGHUP, exit_on_signal );
#endif #endif
init_argv0_dir( argv[0] ); init_argv0_dir( argv[0] );
init_argv0_target( argv[0] ); target = init_argv0_target( argv[0] );
now = time(NULL); now = time(NULL);
...@@ -832,25 +746,10 @@ int main(int argc,char *argv[]) ...@@ -832,25 +746,10 @@ int main(int argc,char *argv[])
} }
} }
switch (target_cpu) if (pointer_size)
{ set_target_ptr_size( &target, pointer_size );
case CPU_x86: else
if (pointer_size == 8) target_cpu = CPU_x86_64; pointer_size = get_target_ptr_size( target );
else pointer_size = 4;
break;
case CPU_x86_64:
if (pointer_size == 4) target_cpu = CPU_x86;
else pointer_size = 8;
break;
case CPU_ARM:
if (pointer_size == 8) target_cpu = CPU_ARM64;
else pointer_size = 4;
break;
case CPU_ARM64:
if (pointer_size == 4) target_cpu = CPU_ARM;
else pointer_size = 8;
break;
}
/* if nothing specified, try to guess output type from the output file name */ /* if nothing specified, try to guess output type from the output file name */
if (output_name && do_everything && !do_header && !do_typelib && !do_proxies && if (output_name && do_everything && !do_header && !do_typelib && !do_proxies &&
......
...@@ -75,13 +75,6 @@ extern time_t now; ...@@ -75,13 +75,6 @@ extern time_t now;
extern int line_number; extern int line_number;
extern int char_number; extern int char_number;
enum target_cpu
{
CPU_x86, CPU_x86_64, CPU_ARM, CPU_ARM64, CPU_LAST = CPU_ARM64
};
extern enum target_cpu target_cpu;
enum stub_mode enum stub_mode
{ {
MODE_Os, /* inline stubs */ MODE_Os, /* inline stubs */
......
...@@ -135,29 +135,17 @@ typedef struct ...@@ -135,29 +135,17 @@ typedef struct
struct resource *resources; /* array of dll resources (format differs between Win16/Win32) */ struct resource *resources; /* array of dll resources (format differs between Win16/Win32) */
} DLLSPEC; } DLLSPEC;
enum target_cpu extern char *target_alias;
{ extern struct target target;
CPU_x86, CPU_x86_64, CPU_ARM, CPU_ARM64, CPU_LAST = CPU_ARM64
};
enum target_platform static inline unsigned int get_ptr_size(void)
{ {
PLATFORM_UNSPECIFIED, return get_target_ptr_size( target );
PLATFORM_APPLE, }
PLATFORM_LINUX,
PLATFORM_FREEBSD,
PLATFORM_MINGW,
PLATFORM_SOLARIS,
PLATFORM_WINDOWS
};
extern char *target_alias;
extern enum target_cpu target_cpu;
extern enum target_platform target_platform;
static inline int is_pe(void) static inline int is_pe(void)
{ {
return target_platform == PLATFORM_MINGW || target_platform == PLATFORM_WINDOWS; return target.platform == PLATFORM_MINGW || target.platform == PLATFORM_WINDOWS;
} }
/* entry point flags */ /* entry point flags */
...@@ -178,9 +166,9 @@ static inline int is_pe(void) ...@@ -178,9 +166,9 @@ static inline int is_pe(void)
#define FLAG_EXPORT32 0x4000 /* 32-bit export in 16-bit spec file */ #define FLAG_EXPORT32 0x4000 /* 32-bit export in 16-bit spec file */
#define FLAG_CPU(cpu) (0x10000 << (cpu)) #define FLAG_CPU(cpu) (0x10000 << (cpu))
#define FLAG_CPU_MASK (FLAG_CPU(CPU_LAST + 1) - FLAG_CPU(0)) #define FLAG_CPU_MASK (FLAG_CPU_WIN32 | FLAG_CPU_WIN64)
#define FLAG_CPU_WIN64 (FLAG_CPU(CPU_x86_64) | FLAG_CPU(CPU_ARM64)) #define FLAG_CPU_WIN64 (FLAG_CPU(CPU_x86_64) | FLAG_CPU(CPU_ARM64))
#define FLAG_CPU_WIN32 (FLAG_CPU_MASK & ~FLAG_CPU_WIN64) #define FLAG_CPU_WIN32 (FLAG_CPU(CPU_i386) | FLAG_CPU(CPU_ARM))
#define MAX_ORDINALS 65535 #define MAX_ORDINALS 65535
...@@ -258,10 +246,8 @@ extern char *make_c_identifier( const char *str ); ...@@ -258,10 +246,8 @@ extern char *make_c_identifier( const char *str );
extern const char *get_stub_name( const ORDDEF *odp, const DLLSPEC *spec ); extern const char *get_stub_name( const ORDDEF *odp, const DLLSPEC *spec );
extern const char *get_link_name( const ORDDEF *odp ); extern const char *get_link_name( const ORDDEF *odp );
extern int sort_func_list( ORDDEF **list, int count, int (*compare)(const void *, const void *) ); extern int sort_func_list( ORDDEF **list, int count, int (*compare)(const void *, const void *) );
extern int get_cpu_from_name( const char *name );
extern unsigned int get_alignment(unsigned int align); extern unsigned int get_alignment(unsigned int align);
extern unsigned int get_page_size(void); extern unsigned int get_page_size(void);
extern unsigned int get_ptr_size(void);
extern unsigned int get_args_size( const ORDDEF *odp ); extern unsigned int get_args_size( const ORDDEF *odp );
extern const char *asm_name( const char *func ); extern const char *asm_name( const char *func );
extern const char *func_declaration( const char *func ); extern const char *func_declaration( const char *func );
......
...@@ -757,7 +757,7 @@ int is_undefined( const char *name ) ...@@ -757,7 +757,7 @@ int is_undefined( const char *name )
/* output the get_pc thunk if needed */ /* output the get_pc thunk if needed */
void output_get_pc_thunk(void) void output_get_pc_thunk(void)
{ {
assert( target_cpu == CPU_x86 ); assert( target.cpu == CPU_i386 );
output( "\n\t.text\n" ); output( "\n\t.text\n" );
output( "\t.align %d\n", get_alignment(4) ); output( "\t.align %d\n", get_alignment(4) );
output( "\t%s\n", func_declaration("__wine_spec_get_pc_thunk_eax") ); output( "\t%s\n", func_declaration("__wine_spec_get_pc_thunk_eax") );
...@@ -777,9 +777,9 @@ static void output_import_thunk( const char *name, const char *table, int pos ) ...@@ -777,9 +777,9 @@ static void output_import_thunk( const char *name, const char *table, int pos )
output( "%s\n", asm_globl(name) ); output( "%s\n", asm_globl(name) );
output_cfi( ".cfi_startproc" ); output_cfi( ".cfi_startproc" );
switch(target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
if (!UsePIC) if (!UsePIC)
{ {
output( "\tjmp *(%s+%d)\n", table, pos ); output( "\tjmp *(%s+%d)\n", table, pos );
...@@ -1050,9 +1050,9 @@ static void output_delayed_import_thunks( const DLLSPEC *spec ) ...@@ -1050,9 +1050,9 @@ static void output_delayed_import_thunks( const DLLSPEC *spec )
output( "\t%s\n", func_declaration("__wine_delay_load_asm") ); output( "\t%s\n", func_declaration("__wine_delay_load_asm") );
output( "%s:\n", asm_name("__wine_delay_load_asm") ); output( "%s:\n", asm_name("__wine_delay_load_asm") );
output_cfi( ".cfi_startproc" ); output_cfi( ".cfi_startproc" );
switch(target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
output( "\tpushl %%ecx\n" ); output( "\tpushl %%ecx\n" );
output_cfi( ".cfi_adjust_cfa_offset 4" ); output_cfi( ".cfi_adjust_cfa_offset 4" );
output( "\tpushl %%edx\n" ); output( "\tpushl %%edx\n" );
...@@ -1137,9 +1137,9 @@ static void output_delayed_import_thunks( const DLLSPEC *spec ) ...@@ -1137,9 +1137,9 @@ static void output_delayed_import_thunks( const DLLSPEC *spec )
if (thumb_mode) output( "\t.thumb_func\n" ); if (thumb_mode) output( "\t.thumb_func\n" );
output( "__wine_delay_imp_%s_%s:\n", import->c_name, name ); output( "__wine_delay_imp_%s_%s:\n", import->c_name, name );
output_cfi( ".cfi_startproc" ); output_cfi( ".cfi_startproc" );
switch(target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
case CPU_x86_64: case CPU_x86_64:
output( "\tmovl $%d,%%eax\n", (idx << 16) | j ); output( "\tmovl $%d,%%eax\n", (idx << 16) | j );
output( "\tjmp %s\n", asm_name("__wine_delay_load_asm") ); output( "\tjmp %s\n", asm_name("__wine_delay_load_asm") );
...@@ -1244,9 +1244,9 @@ void output_stubs( DLLSPEC *spec ) ...@@ -1244,9 +1244,9 @@ void output_stubs( DLLSPEC *spec )
output( "%s:\n", asm_name(name) ); output( "%s:\n", asm_name(name) );
output_cfi( ".cfi_startproc" ); output_cfi( ".cfi_startproc" );
switch (target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
/* flesh out the stub a bit to make safedisc happy */ /* flesh out the stub a bit to make safedisc happy */
output(" \tnop\n" ); output(" \tnop\n" );
output(" \tnop\n" ); output(" \tnop\n" );
...@@ -1398,9 +1398,9 @@ void output_syscalls( DLLSPEC *spec ) ...@@ -1398,9 +1398,9 @@ void output_syscalls( DLLSPEC *spec )
output( "\t%s\n", func_declaration(name) ); output( "\t%s\n", func_declaration(name) );
output( "%s\n", asm_globl(name) ); output( "%s\n", asm_globl(name) );
output_cfi( ".cfi_startproc" ); output_cfi( ".cfi_startproc" );
switch (target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
if (UsePIC) if (UsePIC)
{ {
output( "\tcall %s\n", asm_name("__wine_spec_get_pc_thunk_eax") ); output( "\tcall %s\n", asm_name("__wine_spec_get_pc_thunk_eax") );
...@@ -1463,9 +1463,9 @@ void output_syscalls( DLLSPEC *spec ) ...@@ -1463,9 +1463,9 @@ void output_syscalls( DLLSPEC *spec )
output_function_size( name ); output_function_size( name );
} }
switch (target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
if (UsePIC) break; if (UsePIC) break;
output( "\t.align %d\n", get_alignment(16) ); output( "\t.align %d\n", get_alignment(16) );
output( "\t%s\n", func_declaration("__wine_syscall") ); output( "\t%s\n", func_declaration("__wine_syscall") );
...@@ -1554,7 +1554,7 @@ static void build_library( const char *output_name, struct strarray files, int c ...@@ -1554,7 +1554,7 @@ static void build_library( const char *output_name, struct strarray files, int c
{ {
struct strarray args; struct strarray args;
if (!create || target_platform != PLATFORM_WINDOWS) if (!create || target.platform != PLATFORM_WINDOWS)
{ {
args = find_tool( "ar", NULL ); args = find_tool( "ar", NULL );
strarray_add( &args, create ? "rc" : "r" ); strarray_add( &args, create ? "rc" : "r" );
...@@ -1571,7 +1571,7 @@ static void build_library( const char *output_name, struct strarray files, int c ...@@ -1571,7 +1571,7 @@ static void build_library( const char *output_name, struct strarray files, int c
if (create) unlink( output_name ); if (create) unlink( output_name );
spawn( args ); spawn( args );
if (target_platform != PLATFORM_WINDOWS) if (target.platform != PLATFORM_WINDOWS)
{ {
struct strarray ranlib = find_tool( "ranlib", NULL ); struct strarray ranlib = find_tool( "ranlib", NULL );
strarray_add( &ranlib, output_name ); strarray_add( &ranlib, output_name );
...@@ -1596,9 +1596,9 @@ static void build_windows_import_lib( const char *lib_name, DLLSPEC *spec ) ...@@ -1596,9 +1596,9 @@ static void build_windows_import_lib( const char *lib_name, DLLSPEC *spec )
strarray_add( &args, "-d" ); strarray_add( &args, "-d" );
strarray_add( &args, def_file ); strarray_add( &args, def_file );
switch (target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
strarray_add( &args, "-m" ); strarray_add( &args, "-m" );
strarray_add( &args, "i386" ); strarray_add( &args, "i386" );
strarray_add( &args, "--as-flags=--32" ); strarray_add( &args, "--as-flags=--32" );
......
...@@ -47,31 +47,7 @@ int unix_lib = 0; ...@@ -47,31 +47,7 @@ int unix_lib = 0;
int safe_seh = 0; int safe_seh = 0;
int prefer_native = 0; int prefer_native = 0;
#ifdef __i386__ struct target target = { 0 };
enum target_cpu target_cpu = CPU_x86;
#elif defined(__x86_64__)
enum target_cpu target_cpu = CPU_x86_64;
#elif defined(__arm__)
enum target_cpu target_cpu = CPU_ARM;
#elif defined(__aarch64__)
enum target_cpu target_cpu = CPU_ARM64;
#else
#error Unsupported CPU
#endif
#ifdef __APPLE__
enum target_platform target_platform = PLATFORM_APPLE;
#elif defined(__linux__)
enum target_platform target_platform = PLATFORM_LINUX;
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
enum target_platform target_platform = PLATFORM_FREEBSD;
#elif defined(__sun)
enum target_platform target_platform = PLATFORM_SOLARIS;
#elif defined(_WIN32)
enum target_platform target_platform = PLATFORM_MINGW;
#else
enum target_platform target_platform = PLATFORM_UNSPECIFIED;
#endif
char *target_alias = NULL; char *target_alias = NULL;
...@@ -123,22 +99,6 @@ enum exec_mode_values ...@@ -123,22 +99,6 @@ enum exec_mode_values
static enum exec_mode_values exec_mode = MODE_NONE; static enum exec_mode_values exec_mode = MODE_NONE;
static const struct
{
const char *name;
enum target_platform platform;
} platform_names[] =
{
{ "macos", PLATFORM_APPLE },
{ "darwin", PLATFORM_APPLE },
{ "linux", PLATFORM_LINUX },
{ "freebsd", PLATFORM_FREEBSD },
{ "solaris", PLATFORM_SOLARIS },
{ "mingw32", PLATFORM_MINGW },
{ "windows-gnu", PLATFORM_MINGW },
{ "windows", PLATFORM_WINDOWS },
{ "winnt", PLATFORM_MINGW }
};
/* set the dll file name from the input file name */ /* set the dll file name from the input file name */
static void set_dll_file_name( const char *name, DLLSPEC *spec ) static void set_dll_file_name( const char *name, DLLSPEC *spec )
...@@ -208,54 +168,12 @@ static void set_syscall_table( const char *id, DLLSPEC *spec ) ...@@ -208,54 +168,12 @@ static void set_syscall_table( const char *id, DLLSPEC *spec )
} }
/* set the target CPU and platform */ /* set the target CPU and platform */
static void set_target( const char *target ) static void set_target( const char *name )
{ {
unsigned int i; target_alias = xstrdup( name );
char *p, *spec = xstrdup( target );
/* target specification is in the form CPU-MANUFACTURER-OS or CPU-MANUFACTURER-KERNEL-OS */
target_alias = xstrdup( target );
/* get the CPU part */
if ((p = strchr( spec, '-' )))
{
int cpu;
*p++ = 0;
cpu = get_cpu_from_name( spec );
if (cpu == -1) fatal_error( "Unrecognized CPU '%s'\n", spec );
target_cpu = cpu;
}
else if (!strcmp( spec, "mingw32" ))
{
target_cpu = CPU_x86;
p = spec;
}
else
fatal_error( "Invalid target specification '%s'\n", target );
/* get the OS part */
target_platform = PLATFORM_UNSPECIFIED; /* default value */
for (;;)
{
for (i = 0; i < ARRAY_SIZE(platform_names); i++)
{
if (!strncmp( platform_names[i].name, p, strlen(platform_names[i].name) ))
{
target_platform = platform_names[i].platform;
break;
}
}
if (target_platform != PLATFORM_UNSPECIFIED || !(p = strchr( p, '-' ))) break;
p++;
}
free( spec ); if (!parse_target( name, &target )) fatal_error( "Unrecognized target '%s'\n", name );
if (target.cpu == CPU_ARM && is_pe()) thumb_mode = 1;
if (target_cpu == CPU_ARM && is_pe()) thumb_mode = 1;
} }
/* cleanup on program exit */ /* cleanup on program exit */
...@@ -689,6 +607,9 @@ int main(int argc, char **argv) ...@@ -689,6 +607,9 @@ int main(int argc, char **argv)
signal( SIGTERM, exit_on_signal ); signal( SIGTERM, exit_on_signal );
signal( SIGINT, exit_on_signal ); signal( SIGINT, exit_on_signal );
target = init_argv0_target( argv[0] );
if (target.platform == PLATFORM_CYGWIN) target.platform = PLATFORM_MINGW;
files = parse_options( argc, argv, short_options, long_options, 0, option_callback ); files = parse_options( argc, argv, short_options, long_options, 0, option_callback );
atexit( cleanup ); /* make sure we remove the output file on exit */ atexit( cleanup ); /* make sure we remove the output file on exit */
...@@ -698,19 +619,7 @@ int main(int argc, char **argv) ...@@ -698,19 +619,7 @@ int main(int argc, char **argv)
strcat( spec->file_name, exec_mode == MODE_EXE ? ".exe" : ".dll" ); strcat( spec->file_name, exec_mode == MODE_EXE ? ".exe" : ".dll" );
init_dll_name( spec ); init_dll_name( spec );
switch (target_cpu) if (force_pointer_size) set_target_ptr_size( &target, force_pointer_size );
{
case CPU_x86:
if (force_pointer_size == 8) target_cpu = CPU_x86_64;
break;
case CPU_x86_64:
if (force_pointer_size == 4) target_cpu = CPU_x86;
break;
default:
if (force_pointer_size == 8)
fatal_error( "Cannot build 64-bit code for this CPU\n" );
break;
}
switch(exec_mode) switch(exec_mode)
{ {
......
...@@ -358,7 +358,7 @@ static int parse_spec_export( ORDDEF *odp, DLLSPEC *spec ) ...@@ -358,7 +358,7 @@ static int parse_spec_export( ORDDEF *odp, DLLSPEC *spec )
if (odp->type == TYPE_VARARGS) if (odp->type == TYPE_VARARGS)
odp->flags |= FLAG_NORELAY; /* no relay debug possible for varags entry point */ odp->flags |= FLAG_NORELAY; /* no relay debug possible for varags entry point */
if (target_cpu != CPU_x86) if (target.cpu != CPU_i386)
odp->flags &= ~(FLAG_THISCALL | FLAG_FASTCALL); odp->flags &= ~(FLAG_THISCALL | FLAG_FASTCALL);
if (!(token = GetToken(1))) if (!(token = GetToken(1)))
...@@ -511,7 +511,7 @@ static const char *parse_spec_flags( DLLSPEC *spec, ORDDEF *odp ) ...@@ -511,7 +511,7 @@ static const char *parse_spec_flags( DLLSPEC *spec, ORDDEF *odp )
} }
else if (!strcmp( token, "i386" )) /* backwards compatibility */ else if (!strcmp( token, "i386" )) /* backwards compatibility */
{ {
odp->flags |= FLAG_CPU(CPU_x86); odp->flags |= FLAG_CPU(CPU_i386);
} }
else else
{ {
...@@ -621,7 +621,7 @@ static int parse_spec_ordinal( int ordinal, DLLSPEC *spec ) ...@@ -621,7 +621,7 @@ static int parse_spec_ordinal( int ordinal, DLLSPEC *spec )
assert( 0 ); assert( 0 );
} }
if ((odp->flags & FLAG_CPU_MASK) && !(odp->flags & FLAG_CPU(target_cpu))) if ((odp->flags & FLAG_CPU_MASK) && !(odp->flags & FLAG_CPU(target.cpu)))
{ {
/* ignore this entry point */ /* ignore this entry point */
spec->nb_entry_points--; spec->nb_entry_points--;
......
...@@ -685,9 +685,9 @@ void output_res_o_file( DLLSPEC *spec ) ...@@ -685,9 +685,9 @@ void output_res_o_file( DLLSPEC *spec )
strarray_add( &args, res_file ); strarray_add( &args, res_file );
strarray_add( &args, "-o" ); strarray_add( &args, "-o" );
strarray_add( &args, output_file_name ); strarray_add( &args, output_file_name );
switch (target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
strarray_add( &args, "-F" ); strarray_add( &args, "-F" );
strarray_add( &args, "pe-i386" ); strarray_add( &args, "pe-i386" );
break; break;
......
...@@ -254,9 +254,9 @@ static void output_relay_debug( DLLSPEC *spec ) ...@@ -254,9 +254,9 @@ static void output_relay_debug( DLLSPEC *spec )
if (!needs_relay( odp )) continue; if (!needs_relay( odp )) continue;
switch (target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
output( "\t.align %d\n", get_alignment(4) ); output( "\t.align %d\n", get_alignment(4) );
output( "\t.long 0x90909090,0x90909090\n" ); output( "\t.long 0x90909090,0x90909090\n" );
output( "__wine_spec_relay_entry_point_%d:\n", i ); output( "__wine_spec_relay_entry_point_%d:\n", i );
...@@ -457,7 +457,7 @@ void output_exports( DLLSPEC *spec ) ...@@ -457,7 +457,7 @@ void output_exports( DLLSPEC *spec )
output( "\t%s .L__wine_spec_forwards+%u\n", func_ptr, fwd_size ); output( "\t%s .L__wine_spec_forwards+%u\n", func_ptr, fwd_size );
fwd_size += strlen(odp->link_name) + 1; fwd_size += strlen(odp->link_name) + 1;
} }
else if ((odp->flags & FLAG_IMPORT) && (target_cpu == CPU_x86 || target_cpu == CPU_x86_64)) else if ((odp->flags & FLAG_IMPORT) && (target.cpu == CPU_i386 || target.cpu == CPU_x86_64))
{ {
name = odp->name ? odp->name : odp->export_name; name = odp->name ? odp->name : odp->export_name;
if (name) output( "\t%s %s_%s\n", func_ptr, asm_name("__wine_spec_imp"), name ); if (name) output( "\t%s %s_%s\n", func_ptr, asm_name("__wine_spec_imp"), name );
...@@ -585,9 +585,9 @@ void output_exports( DLLSPEC *spec ) ...@@ -585,9 +585,9 @@ void output_exports( DLLSPEC *spec )
else output( "%s_%u:\n", asm_name("__wine_spec_imp"), i ); else output( "%s_%u:\n", asm_name("__wine_spec_imp"), i );
output_cfi( ".cfi_startproc" ); output_cfi( ".cfi_startproc" );
switch (target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
output( "\t.byte 0x8b,0xff,0x55,0x8b,0xec,0x5d\n" ); /* hotpatch prolog */ output( "\t.byte 0x8b,0xff,0x55,0x8b,0xec,0x5d\n" ); /* hotpatch prolog */
if (UsePIC) if (UsePIC)
{ {
...@@ -623,7 +623,7 @@ void output_module( DLLSPEC *spec ) ...@@ -623,7 +623,7 @@ void output_module( DLLSPEC *spec )
/* Reserve some space for the PE header */ /* Reserve some space for the PE header */
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_MINGW: case PLATFORM_MINGW:
case PLATFORM_WINDOWS: case PLATFORM_WINDOWS:
...@@ -640,9 +640,9 @@ void output_module( DLLSPEC *spec ) ...@@ -640,9 +640,9 @@ void output_module( DLLSPEC *spec )
output( "\t.skip %u\n", 65536 + page_size ); output( "\t.skip %u\n", 65536 + page_size );
break; break;
default: default:
switch(target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
case CPU_x86_64: case CPU_x86_64:
output( "\n\t.section \".init\",\"ax\"\n" ); output( "\n\t.section \".init\",\"ax\"\n" );
output( "\tjmp 1f\n" ); output( "\tjmp 1f\n" );
...@@ -671,9 +671,9 @@ void output_module( DLLSPEC *spec ) ...@@ -671,9 +671,9 @@ void output_module( DLLSPEC *spec )
output( ".L__wine_spec_rva_base:\n" ); output( ".L__wine_spec_rva_base:\n" );
output( "\t.long 0x4550\n" ); /* Signature */ output( "\t.long 0x4550\n" ); /* Signature */
switch(target_cpu) switch (target.cpu)
{ {
case CPU_x86: machine = IMAGE_FILE_MACHINE_I386; break; case CPU_i386: machine = IMAGE_FILE_MACHINE_I386; break;
case CPU_x86_64: machine = IMAGE_FILE_MACHINE_AMD64; break; case CPU_x86_64: machine = IMAGE_FILE_MACHINE_AMD64; break;
case CPU_ARM: machine = IMAGE_FILE_MACHINE_ARMNT; break; case CPU_ARM: machine = IMAGE_FILE_MACHINE_ARMNT; break;
case CPU_ARM64: machine = IMAGE_FILE_MACHINE_ARM64; break; case CPU_ARM64: machine = IMAGE_FILE_MACHINE_ARM64; break;
...@@ -739,7 +739,7 @@ void output_module( DLLSPEC *spec ) ...@@ -739,7 +739,7 @@ void output_module( DLLSPEC *spec )
output_data_directories( data_dirs ); output_data_directories( data_dirs );
if (target_platform == PLATFORM_APPLE) if (target.platform == PLATFORM_APPLE)
output( "\t.lcomm %s,4\n", asm_name("_end") ); output( "\t.lcomm %s,4\n", asm_name("_end") );
} }
...@@ -964,9 +964,9 @@ void output_fake_module( DLLSPEC *spec ) ...@@ -964,9 +964,9 @@ void output_fake_module( DLLSPEC *spec )
put_data( fakedll_signature, sizeof(fakedll_signature) ); put_data( fakedll_signature, sizeof(fakedll_signature) );
put_dword( 0x4550 ); /* Signature */ put_dword( 0x4550 ); /* Signature */
switch(target_cpu) switch (target.cpu)
{ {
case CPU_x86: put_word( IMAGE_FILE_MACHINE_I386 ); break; case CPU_i386: put_word( IMAGE_FILE_MACHINE_I386 ); break;
case CPU_x86_64: put_word( IMAGE_FILE_MACHINE_AMD64 ); break; case CPU_x86_64: put_word( IMAGE_FILE_MACHINE_AMD64 ); break;
case CPU_ARM: put_word( IMAGE_FILE_MACHINE_ARMNT ); break; case CPU_ARM: put_word( IMAGE_FILE_MACHINE_ARMNT ); break;
case CPU_ARM64: put_word( IMAGE_FILE_MACHINE_ARM64 ); break; case CPU_ARM64: put_word( IMAGE_FILE_MACHINE_ARM64 ); break;
...@@ -1105,7 +1105,7 @@ void output_def_file( DLLSPEC *spec, int import_only ) ...@@ -1105,7 +1105,7 @@ void output_def_file( DLLSPEC *spec, int import_only )
case TYPE_STDCALL: case TYPE_STDCALL:
{ {
int at_param = get_args_size( odp ); int at_param = get_args_size( odp );
if (!kill_at && target_cpu == CPU_x86) output( "@%d", at_param ); if (!kill_at && target.cpu == CPU_i386) output( "@%d", at_param );
if (import_only) break; if (import_only) break;
if (odp->flags & FLAG_FORWARD) if (odp->flags & FLAG_FORWARD)
output( "=%s", odp->link_name ); output( "=%s", odp->link_name );
...@@ -1114,7 +1114,7 @@ void output_def_file( DLLSPEC *spec, int import_only ) ...@@ -1114,7 +1114,7 @@ void output_def_file( DLLSPEC *spec, int import_only )
break; break;
} }
case TYPE_STUB: case TYPE_STUB:
if (!kill_at && target_cpu == CPU_x86) output( "@%d", get_args_size( odp )); if (!kill_at && target.cpu == CPU_i386) output( "@%d", get_args_size( odp ));
is_private = 1; is_private = 1;
break; break;
default: default:
......
...@@ -32,28 +32,6 @@ ...@@ -32,28 +32,6 @@
static struct strarray tmp_files; static struct strarray tmp_files;
static const char *output_file_source_name; static const char *output_file_source_name;
static const struct
{
const char *name;
enum target_cpu cpu;
} cpu_names[] =
{
{ "i386", CPU_x86 },
{ "i486", CPU_x86 },
{ "i586", CPU_x86 },
{ "i686", CPU_x86 },
{ "i786", CPU_x86 },
{ "amd64", CPU_x86_64 },
{ "x86_64", CPU_x86_64 },
{ "arm", CPU_ARM },
{ "armv5", CPU_ARM },
{ "armv6", CPU_ARM },
{ "armv7", CPU_ARM },
{ "armv7a", CPU_ARM },
{ "arm64", CPU_ARM64 },
{ "aarch64", CPU_ARM64 },
};
/* atexit handler to clean tmp files */ /* atexit handler to clean tmp files */
void cleanup_tmp_files(void) void cleanup_tmp_files(void)
{ {
...@@ -338,7 +316,7 @@ struct strarray get_as_command(void) ...@@ -338,7 +316,7 @@ struct strarray get_as_command(void)
if (force_pointer_size) if (force_pointer_size)
{ {
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: case PLATFORM_APPLE:
strarray_add( &args, "-arch" ); strarray_add( &args, "-arch" );
...@@ -369,7 +347,7 @@ struct strarray get_ld_command(void) ...@@ -369,7 +347,7 @@ struct strarray get_ld_command(void)
if (force_pointer_size) if (force_pointer_size)
{ {
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: case PLATFORM_APPLE:
strarray_add( &args, "-arch" ); strarray_add( &args, "-arch" );
...@@ -391,7 +369,7 @@ struct strarray get_ld_command(void) ...@@ -391,7 +369,7 @@ struct strarray get_ld_command(void)
} }
} }
if (target_cpu == CPU_ARM && !is_pe()) if (target.cpu == CPU_ARM && !is_pe())
strarray_add( &args, "--no-wchar-size-warning" ); strarray_add( &args, "--no-wchar-size-warning" );
return args; return args;
...@@ -696,7 +674,7 @@ int remove_stdcall_decoration( char *name ) ...@@ -696,7 +674,7 @@ int remove_stdcall_decoration( char *name )
{ {
char *p, *end = strrchr( name, '@' ); char *p, *end = strrchr( name, '@' );
if (!end || !end[1] || end == name) return -1; if (!end || !end[1] || end == name) return -1;
if (target_cpu != CPU_x86) return -1; if (target.cpu != CPU_i386) return -1;
/* make sure all the rest is digits */ /* make sure all the rest is digits */
for (p = end + 1; *p; p++) if (!isdigit(*p)) return -1; for (p = end + 1; *p; p++) if (!isdigit(*p)) return -1;
*end = 0; *end = 0;
...@@ -822,7 +800,7 @@ const char *get_link_name( const ORDDEF *odp ) ...@@ -822,7 +800,7 @@ const char *get_link_name( const ORDDEF *odp )
static char *buffer; static char *buffer;
char *ret; char *ret;
if (target_cpu != CPU_x86) return odp->link_name; if (target.cpu != CPU_i386) return odp->link_name;
switch (odp->type) switch (odp->type)
{ {
...@@ -877,16 +855,6 @@ int sort_func_list( ORDDEF **list, int count, int (*compare)(const void *, const ...@@ -877,16 +855,6 @@ int sort_func_list( ORDDEF **list, int count, int (*compare)(const void *, const
} }
/* parse a cpu name and return the corresponding value */
int get_cpu_from_name( const char *name )
{
unsigned int i;
for (i = 0; i < ARRAY_SIZE(cpu_names); i++)
if (!strcmp( cpu_names[i].name, name )) return cpu_names[i].cpu;
return -1;
}
/***************************************************************** /*****************************************************************
* Function: get_alignment * Function: get_alignment
* *
...@@ -917,11 +885,11 @@ unsigned int get_alignment(unsigned int align) ...@@ -917,11 +885,11 @@ unsigned int get_alignment(unsigned int align)
assert( !(align & (align - 1)) ); assert( !(align & (align - 1)) );
switch(target_cpu) switch (target.cpu)
{ {
case CPU_x86: case CPU_i386:
case CPU_x86_64: case CPU_x86_64:
if (target_platform != PLATFORM_APPLE) return align; if (target.platform != PLATFORM_APPLE) return align;
/* fall through */ /* fall through */
case CPU_ARM: case CPU_ARM:
case CPU_ARM64: case CPU_ARM64:
...@@ -940,23 +908,6 @@ unsigned int get_page_size(void) ...@@ -940,23 +908,6 @@ unsigned int get_page_size(void)
return 0x1000; /* same on all platforms */ return 0x1000; /* same on all platforms */
} }
/* return the size of a pointer on the target CPU */
unsigned int get_ptr_size(void)
{
switch(target_cpu)
{
case CPU_x86:
case CPU_ARM:
return 4;
case CPU_x86_64:
case CPU_ARM64:
return 8;
}
/* unreached */
assert(0);
return 0;
}
/* return the total size in bytes of the arguments on the stack */ /* return the total size in bytes of the arguments on the stack */
unsigned int get_args_size( const ORDDEF *odp ) unsigned int get_args_size( const ORDDEF *odp )
{ {
...@@ -968,12 +919,12 @@ unsigned int get_args_size( const ORDDEF *odp ) ...@@ -968,12 +919,12 @@ unsigned int get_args_size( const ORDDEF *odp )
{ {
case ARG_INT64: case ARG_INT64:
case ARG_DOUBLE: case ARG_DOUBLE:
if (target_cpu == CPU_ARM) size = (size + 7) & ~7; if (target.cpu == CPU_ARM) size = (size + 7) & ~7;
size += 8; size += 8;
break; break;
case ARG_INT128: case ARG_INT128:
/* int128 is passed as pointer on x86_64 */ /* int128 is passed as pointer on x86_64 */
if (target_cpu != CPU_x86_64) if (target.cpu != CPU_x86_64)
{ {
size += 16; size += 16;
break; break;
...@@ -992,11 +943,11 @@ const char *asm_name( const char *sym ) ...@@ -992,11 +943,11 @@ const char *asm_name( const char *sym )
{ {
static char *buffer; static char *buffer;
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_MINGW: case PLATFORM_MINGW:
case PLATFORM_WINDOWS: case PLATFORM_WINDOWS:
if (target_cpu != CPU_x86) return sym; if (target.cpu != CPU_i386) return sym;
if (sym[0] == '@') return sym; /* fastcall */ if (sym[0] == '@') return sym; /* fastcall */
/* fall through */ /* fall through */
case PLATFORM_APPLE: case PLATFORM_APPLE:
...@@ -1014,7 +965,7 @@ const char *func_declaration( const char *func ) ...@@ -1014,7 +965,7 @@ const char *func_declaration( const char *func )
{ {
static char *buffer; static char *buffer;
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: case PLATFORM_APPLE:
return ""; return "";
...@@ -1026,7 +977,7 @@ const char *func_declaration( const char *func ) ...@@ -1026,7 +977,7 @@ const char *func_declaration( const char *func )
break; break;
default: default:
free( buffer ); free( buffer );
switch(target_cpu) switch (target.cpu)
{ {
case CPU_ARM: case CPU_ARM:
buffer = strmake( ".type %s,%%function%s", func, buffer = strmake( ".type %s,%%function%s", func,
...@@ -1047,7 +998,7 @@ const char *func_declaration( const char *func ) ...@@ -1047,7 +998,7 @@ const char *func_declaration( const char *func )
/* output a size declaration for an assembly function */ /* output a size declaration for an assembly function */
void output_function_size( const char *name ) void output_function_size( const char *name )
{ {
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: case PLATFORM_APPLE:
case PLATFORM_MINGW: case PLATFORM_MINGW:
...@@ -1078,7 +1029,7 @@ void output_rva( const char *format, ... ) ...@@ -1078,7 +1029,7 @@ void output_rva( const char *format, ... )
va_list valist; va_list valist;
va_start( valist, format ); va_start( valist, format );
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_MINGW: case PLATFORM_MINGW:
case PLATFORM_WINDOWS: case PLATFORM_WINDOWS:
...@@ -1098,14 +1049,14 @@ void output_rva( const char *format, ... ) ...@@ -1098,14 +1049,14 @@ void output_rva( const char *format, ... )
/* output the GNU note for non-exec stack */ /* output the GNU note for non-exec stack */
void output_gnu_stack_note(void) void output_gnu_stack_note(void)
{ {
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_MINGW: case PLATFORM_MINGW:
case PLATFORM_WINDOWS: case PLATFORM_WINDOWS:
case PLATFORM_APPLE: case PLATFORM_APPLE:
break; break;
default: default:
switch(target_cpu) switch (target.cpu)
{ {
case CPU_ARM: case CPU_ARM:
case CPU_ARM64: case CPU_ARM64:
...@@ -1125,15 +1076,15 @@ const char *asm_globl( const char *func ) ...@@ -1125,15 +1076,15 @@ const char *asm_globl( const char *func )
static char *buffer; static char *buffer;
free( buffer ); free( buffer );
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: case PLATFORM_APPLE:
buffer = strmake( "\t.globl _%s\n\t.private_extern _%s\n_%s:", func, func, func ); buffer = strmake( "\t.globl _%s\n\t.private_extern _%s\n_%s:", func, func, func );
break; break;
case PLATFORM_MINGW: case PLATFORM_MINGW:
case PLATFORM_WINDOWS: case PLATFORM_WINDOWS:
buffer = strmake( "\t.globl %s%s\n%s%s:", target_cpu == CPU_x86 ? "_" : "", func, buffer = strmake( "\t.globl %s%s\n%s%s:", target.cpu == CPU_i386 ? "_" : "", func,
target_cpu == CPU_x86 ? "_" : "", func ); target.cpu == CPU_i386 ? "_" : "", func );
break; break;
default: default:
buffer = strmake( "\t.globl %s\n\t.hidden %s\n%s:", func, func, func ); buffer = strmake( "\t.globl %s\n\t.hidden %s\n%s:", func, func, func );
...@@ -1155,7 +1106,7 @@ const char *get_asm_ptr_keyword(void) ...@@ -1155,7 +1106,7 @@ const char *get_asm_ptr_keyword(void)
const char *get_asm_string_keyword(void) const char *get_asm_string_keyword(void)
{ {
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: case PLATFORM_APPLE:
return ".asciz"; return ".asciz";
...@@ -1166,7 +1117,7 @@ const char *get_asm_string_keyword(void) ...@@ -1166,7 +1117,7 @@ const char *get_asm_string_keyword(void)
const char *get_asm_export_section(void) const char *get_asm_export_section(void)
{ {
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: return ".data"; case PLATFORM_APPLE: return ".data";
case PLATFORM_MINGW: case PLATFORM_MINGW:
...@@ -1177,7 +1128,7 @@ const char *get_asm_export_section(void) ...@@ -1177,7 +1128,7 @@ const char *get_asm_export_section(void)
const char *get_asm_rodata_section(void) const char *get_asm_rodata_section(void)
{ {
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: return ".const"; case PLATFORM_APPLE: return ".const";
default: return ".section .rodata"; default: return ".section .rodata";
...@@ -1186,7 +1137,7 @@ const char *get_asm_rodata_section(void) ...@@ -1186,7 +1137,7 @@ const char *get_asm_rodata_section(void)
const char *get_asm_rsrc_section(void) const char *get_asm_rsrc_section(void)
{ {
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: return ".data"; case PLATFORM_APPLE: return ".data";
case PLATFORM_MINGW: case PLATFORM_MINGW:
...@@ -1197,7 +1148,7 @@ const char *get_asm_rsrc_section(void) ...@@ -1197,7 +1148,7 @@ const char *get_asm_rsrc_section(void)
const char *get_asm_string_section(void) const char *get_asm_string_section(void)
{ {
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: return ".cstring"; case PLATFORM_APPLE: return ".cstring";
default: return ".section .rodata"; default: return ".section .rodata";
...@@ -1208,7 +1159,7 @@ const char *arm64_page( const char *sym ) ...@@ -1208,7 +1159,7 @@ const char *arm64_page( const char *sym )
{ {
static char *buffer; static char *buffer;
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: case PLATFORM_APPLE:
free( buffer ); free( buffer );
...@@ -1224,7 +1175,7 @@ const char *arm64_pageoff( const char *sym ) ...@@ -1224,7 +1175,7 @@ const char *arm64_pageoff( const char *sym )
static char *buffer; static char *buffer;
free( buffer ); free( buffer );
switch (target_platform) switch (target.platform)
{ {
case PLATFORM_APPLE: case PLATFORM_APPLE:
buffer = strmake( "%s@PAGEOFF", sym ); buffer = strmake( "%s@PAGEOFF", sym );
......
...@@ -115,10 +115,12 @@ static char* try_lib_path(const char* dir, const char* pre, ...@@ -115,10 +115,12 @@ static char* try_lib_path(const char* dir, const char* pre,
return 0; return 0;
} }
static file_type guess_lib_type(enum target_platform platform, const char* dir, static file_type guess_lib_type(struct target target, const char* dir,
const char* library, const char *prefix, const char *suffix, char** file) const char* library, const char *prefix, const char *suffix, char** file)
{ {
if (platform != PLATFORM_WINDOWS && platform != PLATFORM_MINGW && platform != PLATFORM_CYGWIN) if (target.platform != PLATFORM_WINDOWS &&
target.platform != PLATFORM_MINGW &&
target.platform != PLATFORM_CYGWIN)
{ {
/* Unix shared object */ /* Unix shared object */
if ((*file = try_lib_path(dir, prefix, library, ".so", file_so))) if ((*file = try_lib_path(dir, prefix, library, ".so", file_so)))
...@@ -140,7 +142,7 @@ static file_type guess_lib_type(enum target_platform platform, const char* dir, ...@@ -140,7 +142,7 @@ static file_type guess_lib_type(enum target_platform platform, const char* dir,
return file_na; return file_na;
} }
file_type get_lib_type(enum target_platform platform, struct strarray path, const char *library, file_type get_lib_type(struct target target, struct strarray path, const char *library,
const char *prefix, const char *suffix, char** file) const char *prefix, const char *suffix, char** file)
{ {
unsigned int i; unsigned int i;
...@@ -148,7 +150,7 @@ file_type get_lib_type(enum target_platform platform, struct strarray path, cons ...@@ -148,7 +150,7 @@ file_type get_lib_type(enum target_platform platform, struct strarray path, cons
if (!suffix) suffix = ".a"; if (!suffix) suffix = ".a";
for (i = 0; i < path.count; i++) for (i = 0; i < path.count; i++)
{ {
file_type type = guess_lib_type(platform, path.str[i], library, prefix, suffix, file); file_type type = guess_lib_type(target, path.str[i], library, prefix, suffix, file);
if (type != file_na) return type; if (type != file_na) return type;
} }
return file_na; return file_na;
......
...@@ -32,22 +32,6 @@ ...@@ -32,22 +32,6 @@
# endif # endif
#endif #endif
enum target_cpu
{
CPU_x86, CPU_x86_64, CPU_ARM, CPU_ARM64
};
enum target_platform
{
PLATFORM_UNSPECIFIED,
PLATFORM_APPLE,
PLATFORM_ANDROID,
PLATFORM_SOLARIS,
PLATFORM_WINDOWS,
PLATFORM_MINGW,
PLATFORM_CYGWIN
};
void DECLSPEC_NORETURN error(const char* s, ...); void DECLSPEC_NORETURN error(const char* s, ...);
typedef enum { typedef enum {
...@@ -57,7 +41,7 @@ typedef enum { ...@@ -57,7 +41,7 @@ typedef enum {
void create_file(const char* name, int mode, const char* fmt, ...); void create_file(const char* name, int mode, const char* fmt, ...);
file_type get_file_type(const char* filename); file_type get_file_type(const char* filename);
file_type get_lib_type(enum target_platform platform, struct strarray path, const char *library, file_type get_lib_type(struct target target, struct strarray path, const char *library,
const char *prefix, const char *suffix, char** file); const char *prefix, const char *suffix, char** file);
const char *find_binary( struct strarray prefix, const char *name ); const char *find_binary( struct strarray prefix, const char *name );
int spawn(struct strarray prefix, struct strarray arr, int ignore_errors); int spawn(struct strarray prefix, struct strarray arr, int ignore_errors);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment