Commit 4243befc authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

winebuild: Add -marm64x option for generating hybrid ARM64X import libraries.

parent 6ad60648
...@@ -162,6 +162,7 @@ typedef struct ...@@ -162,6 +162,7 @@ typedef struct
int unicode_app; /* default to unicode entry point */ int unicode_app; /* default to unicode entry point */
ORDDEF *entry_points; /* spec entry points */ ORDDEF *entry_points; /* spec entry points */
struct exports exports; /* dll exports */ struct exports exports; /* dll exports */
struct exports native_exports; /* dll native exports */
struct resource *resources; /* array of dll resources (format differs between Win16/Win32) */ struct resource *resources; /* array of dll resources (format differs between Win16/Win32) */
struct apiset apiset; /* list of defined api sets */ struct apiset apiset; /* list of defined api sets */
} DLLSPEC; } DLLSPEC;
...@@ -327,7 +328,7 @@ extern void output_bin_resources( DLLSPEC *spec, unsigned int start_rva ); ...@@ -327,7 +328,7 @@ extern void output_bin_resources( DLLSPEC *spec, unsigned int start_rva );
extern void output_spec32_file( DLLSPEC *spec ); extern void output_spec32_file( DLLSPEC *spec );
extern void output_fake_module( DLLSPEC *spec ); extern void output_fake_module( DLLSPEC *spec );
extern void output_data_module( DLLSPEC *spec ); extern void output_data_module( DLLSPEC *spec );
extern void output_def_file( DLLSPEC *spec, int import_only ); extern void output_def_file( DLLSPEC *spec, struct exports *exports, int import_only );
extern void output_apiset_lib( DLLSPEC *spec, const struct apiset *apiset ); extern void output_apiset_lib( DLLSPEC *spec, const struct apiset *apiset );
extern void load_res16_file( const char *name, DLLSPEC *spec ); extern void load_res16_file( const char *name, DLLSPEC *spec );
extern void output_res16_data( DLLSPEC *spec ); extern void output_res16_data( DLLSPEC *spec );
...@@ -372,6 +373,7 @@ extern int force_pointer_size; ...@@ -372,6 +373,7 @@ extern int force_pointer_size;
extern int unwind_tables; extern int unwind_tables;
extern int use_dlltool; extern int use_dlltool;
extern int use_msvcrt; extern int use_msvcrt;
extern int native_arch;
extern int safe_seh; extern int safe_seh;
extern int prefer_native; extern int prefer_native;
extern int data_only; extern int data_only;
......
...@@ -1377,19 +1377,31 @@ void output_static_lib( const char *output_name, struct strarray files, int crea ...@@ -1377,19 +1377,31 @@ void output_static_lib( const char *output_name, struct strarray files, int crea
/* create a Windows-style import library using dlltool */ /* create a Windows-style import library using dlltool */
static void build_dlltool_import_lib( const char *lib_name, DLLSPEC *spec, struct strarray files ) static void build_dlltool_import_lib( const char *lib_name, DLLSPEC *spec, struct strarray files )
{ {
const char *def_file, *native_def_file = NULL;
struct strarray args; struct strarray args;
char *def_file;
def_file = open_temp_output_file( ".def" ); def_file = open_temp_output_file( ".def" );
output_def_file( spec, 1 ); output_def_file( spec, &spec->exports, 1 );
fclose( output_file ); fclose( output_file );
if (native_arch != -1)
{
native_def_file = open_temp_output_file( ".def" );
output_def_file( spec, &spec->native_exports, 1 );
fclose( output_file );
}
args = find_tool( "dlltool", NULL ); args = find_tool( "dlltool", NULL );
strarray_add( &args, "-k" ); strarray_add( &args, "-k" );
strarray_add( &args, strendswith( lib_name, ".delay.a" ) ? "-y" : "-l" ); strarray_add( &args, strendswith( lib_name, ".delay.a" ) ? "-y" : "-l" );
strarray_add( &args, lib_name ); strarray_add( &args, lib_name );
strarray_add( &args, "-d" ); strarray_add( &args, "-d" );
strarray_add( &args, def_file ); strarray_add( &args, def_file );
if (native_def_file)
{
strarray_add( &args, "-N" );
strarray_add( &args, native_def_file );
}
switch (target.cpu) switch (target.cpu)
{ {
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
int UsePIC = 0; int UsePIC = 0;
int nb_errors = 0; int nb_errors = 0;
int display_warnings = 0; int display_warnings = 0;
int native_arch = -1;
int kill_at = 0; int kill_at = 0;
int verbose = 0; int verbose = 0;
int link_ext_symbols = 0; int link_ext_symbols = 0;
...@@ -386,6 +387,7 @@ static void option_callback( int optc, char *optarg ) ...@@ -386,6 +387,7 @@ static void option_callback( int optc, char *optarg )
else if (!strcmp( optarg, "64" )) force_pointer_size = 8; else if (!strcmp( optarg, "64" )) force_pointer_size = 8;
else if (!strcmp( optarg, "no-cygwin" )) use_msvcrt = 1; else if (!strcmp( optarg, "no-cygwin" )) use_msvcrt = 1;
else if (!strcmp( optarg, "unicode" )) main_spec->unicode_app = 1; else if (!strcmp( optarg, "unicode" )) main_spec->unicode_app = 1;
else if (!strcmp( optarg, "arm64x" )) native_arch = CPU_ARM64;
else if (!strncmp( optarg, "cpu=", 4 )) cpu_option = xstrdup( optarg + 4 ); else if (!strncmp( optarg, "cpu=", 4 )) cpu_option = xstrdup( optarg + 4 );
else if (!strncmp( optarg, "fpu=", 4 )) fpu_option = xstrdup( optarg + 4 ); else if (!strncmp( optarg, "fpu=", 4 )) fpu_option = xstrdup( optarg + 4 );
else if (!strncmp( optarg, "arch=", 5 )) arch_option = xstrdup( optarg + 5 ); else if (!strncmp( optarg, "arch=", 5 )) arch_option = xstrdup( optarg + 5 );
...@@ -648,7 +650,7 @@ int main(int argc, char **argv) ...@@ -648,7 +650,7 @@ int main(int argc, char **argv)
if (!spec_file_name) fatal_error( "missing .spec file\n" ); if (!spec_file_name) fatal_error( "missing .spec file\n" );
if (!parse_input_file( spec )) break; if (!parse_input_file( spec )) break;
open_output_file(); open_output_file();
output_def_file( spec, 0 ); output_def_file( spec, &spec->exports, 0 );
close_output_file(); close_output_file();
break; break;
case MODE_IMPLIB: case MODE_IMPLIB:
......
...@@ -943,16 +943,15 @@ static void assign_ordinals( struct exports *exports ) ...@@ -943,16 +943,15 @@ static void assign_ordinals( struct exports *exports )
} }
static void assign_exports( DLLSPEC *spec ) static void assign_exports( DLLSPEC *spec, unsigned int cpu, struct exports *exports )
{ {
struct exports *exports = &spec->exports;
unsigned int i; unsigned int i;
exports->entry_points = xmalloc( spec->nb_entry_points * sizeof(*exports->entry_points) ); exports->entry_points = xmalloc( spec->nb_entry_points * sizeof(*exports->entry_points) );
for (i = 0; i < spec->nb_entry_points; i++) for (i = 0; i < spec->nb_entry_points; i++)
{ {
ORDDEF *entry = &spec->entry_points[i]; ORDDEF *entry = &spec->entry_points[i];
if ((entry->flags & FLAG_CPU_MASK) && !(entry->flags & FLAG_CPU(target.cpu))) if ((entry->flags & FLAG_CPU_MASK) && !(entry->flags & FLAG_CPU(cpu)))
continue; continue;
exports->entry_points[exports->nb_entry_points++] = entry; exports->entry_points[exports->nb_entry_points++] = entry;
} }
...@@ -1018,7 +1017,7 @@ void add_16bit_exports( DLLSPEC *spec32, DLLSPEC *spec16 ) ...@@ -1018,7 +1017,7 @@ void add_16bit_exports( DLLSPEC *spec32, DLLSPEC *spec16 )
odp->u.func.nb_args * sizeof(odp->u.func.args[0]) ); odp->u.func.nb_args * sizeof(odp->u.func.args[0]) );
} }
assign_exports( spec32 ); assign_exports( spec32, target.cpu, &spec32->exports );
} }
...@@ -1061,7 +1060,8 @@ int parse_spec_file( FILE *file, DLLSPEC *spec ) ...@@ -1061,7 +1060,8 @@ int parse_spec_file( FILE *file, DLLSPEC *spec )
} }
current_line = 0; /* no longer parsing the input file */ current_line = 0; /* no longer parsing the input file */
assign_exports( spec ); assign_exports( spec, target.cpu, &spec->exports );
if (native_arch != -1) assign_exports( spec, native_arch, &spec->native_exports );
return !nb_errors; return !nb_errors;
} }
...@@ -1303,6 +1303,6 @@ int parse_def_file( FILE *file, DLLSPEC *spec ) ...@@ -1303,6 +1303,6 @@ int parse_def_file( FILE *file, DLLSPEC *spec )
} }
current_line = 0; /* no longer parsing the input file */ current_line = 0; /* no longer parsing the input file */
assign_exports( spec ); assign_exports( spec, target.cpu, &spec->exports );
return !nb_errors; return !nb_errors;
} }
...@@ -1343,9 +1343,8 @@ void output_data_module( DLLSPEC *spec ) ...@@ -1343,9 +1343,8 @@ void output_data_module( DLLSPEC *spec )
* *
* Build a Win32 def file from a spec file. * Build a Win32 def file from a spec file.
*/ */
void output_def_file( DLLSPEC *spec, int import_only ) void output_def_file( DLLSPEC *spec, struct exports *exports, int import_only )
{ {
struct exports *exports;
DLLSPEC *spec32 = NULL; DLLSPEC *spec32 = NULL;
const char *name; const char *name;
int i, total; int i, total;
...@@ -1355,8 +1354,8 @@ void output_def_file( DLLSPEC *spec, int import_only ) ...@@ -1355,8 +1354,8 @@ void output_def_file( DLLSPEC *spec, int import_only )
spec32 = alloc_dll_spec(); spec32 = alloc_dll_spec();
add_16bit_exports( spec32, spec ); add_16bit_exports( spec32, spec );
spec = spec32; spec = spec32;
exports = &spec->exports;
} }
exports = &spec->exports;
if (spec_file_name) if (spec_file_name)
output( "; File generated automatically from %s; do not edit!\n\n", output( "; File generated automatically from %s; do not edit!\n\n",
......
...@@ -615,6 +615,7 @@ DLLSPEC *alloc_dll_spec(void) ...@@ -615,6 +615,7 @@ DLLSPEC *alloc_dll_spec(void)
spec->subsystem_minor = 0; spec->subsystem_minor = 0;
spec->dll_characteristics = IMAGE_DLLCHARACTERISTICS_NX_COMPAT | IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE; spec->dll_characteristics = IMAGE_DLLCHARACTERISTICS_NX_COMPAT | IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE;
spec->exports.base = MAX_ORDINALS; spec->exports.base = MAX_ORDINALS;
spec->native_exports.base = MAX_ORDINALS;
return spec; return spec;
} }
...@@ -644,6 +645,7 @@ void free_dll_spec( DLLSPEC *spec ) ...@@ -644,6 +645,7 @@ void free_dll_spec( DLLSPEC *spec )
free( odp->link_name ); free( odp->link_name );
} }
free_exports( &spec->exports ); free_exports( &spec->exports );
free_exports( &spec->native_exports );
free( spec->file_name ); free( spec->file_name );
free( spec->dll_name ); free( spec->dll_name );
free( spec->c_name ); free( spec->c_name );
......
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