I originally planned to somehow pass hybrid/native arch info from configure instead of hardcoding it in makedep, but I'm no longer convinced it's worth extra per-arch variables. I will change it if that would be preferred.
CC @bylaws
From: Jacek Caban jacek@codeweavers.com
--- tools/makedep.c | 107 +++++++++++++++++++++++++++++++++++++++--------- tools/tools.h | 2 +- 2 files changed, 88 insertions(+), 21 deletions(-)
diff --git a/tools/makedep.c b/tools/makedep.c index 8ce575b15ca..77cf6e476bb 100644 --- a/tools/makedep.c +++ b/tools/makedep.c @@ -172,6 +172,9 @@ static struct strarray target_flags[MAX_ARCHS]; static struct strarray extra_cflags[MAX_ARCHS]; static struct strarray extra_cflags_extlib[MAX_ARCHS]; static struct strarray disabled_dirs[MAX_ARCHS]; +static unsigned int native_archs[MAX_ARCHS]; +static unsigned int hybrid_archs[MAX_ARCHS]; +static struct strarray hybrid_target_flags[MAX_ARCHS];
struct makefile { @@ -590,6 +593,20 @@ static int is_native_arch_disabled( struct makefile *make ) }
+/******************************************************************* + * get_link_arch + */ +static int get_link_arch( struct makefile *make, unsigned int arch, unsigned int *link_arch ) +{ + unsigned int hybrid_arch = hybrid_archs[arch]; + if (native_archs[arch]) return 0; + if (hybrid_arch && make->disabled[hybrid_arch]) hybrid_arch = 0; + if (make->disabled[arch] && !hybrid_arch) return 0; + *link_arch = hybrid_arch ? hybrid_arch : arch; + return 1; +} + + /******************************************************************* * is_multiarch * @@ -2270,6 +2287,8 @@ static struct strarray add_import_libs( const struct makefile *make, struct stra struct strarray ret = empty_strarray; unsigned int i;
+ if (native_archs[arch]) arch = native_archs[arch]; + for (i = 0; i < imports.count; i++) { const char *name = imports.str[i]; @@ -2414,6 +2433,8 @@ static void output_winegcc_command( struct makefile *make, unsigned int arch ) output_filename( tools_path( make, "winebuild" )); } output_filenames( target_flags[arch] ); + if (native_archs[arch] && !make->disabled[native_archs[arch]]) + output_filenames( hybrid_target_flags[arch] ); if (arch) return; output_filename( "-mno-cygwin" ); output_filenames( lddll_flags ); @@ -2889,8 +2910,9 @@ static void output_source_idl( struct makefile *make, struct incl_file *source, output( ":" ); for (i = 0; i < source->importlibdeps.count; i++) { + int native_arch = native_archs[arch] ? native_archs[arch] : arch; struct makefile *submake = find_importlib_module( source->importlibdeps.str[i] ); - const char *module = strmake( "%s%s", arch_pe_dirs[arch], submake->module ); + const char *module = strmake( "%s%s", arch_pe_dirs[native_arch], submake->module ); output_filename( obj_dir_path( submake, module )); } output( "\n" ); @@ -3077,7 +3099,7 @@ static void output_source_testdll( struct makefile *make, struct incl_file *sour struct strarray all_libs, dep_libs; const char *dll_name, *obj_name, *res_name, *output_rsrc, *output_file, *debug_file, *ext = ".dll"; struct incl_file *spec_file = find_src_file( make, strmake( "%s.spec", obj )); - unsigned int arch; + unsigned int arch, link_arch;
if (!imports.count) imports = make->imports; strarray_addall( &dll_flags, make->extradllflags ); @@ -3087,13 +3109,18 @@ static void output_source_testdll( struct makefile *make, struct incl_file *sour
for (arch = 0; arch < archs.count; arch++) { - if (!is_multiarch( arch )) continue; + const char *hybrid_obj_name = NULL; + + if (!is_multiarch( arch ) || !get_link_arch( make, arch, &link_arch)) continue; + all_libs = dep_libs = empty_strarray; strarray_addall( &all_libs, add_import_libs( make, &dep_libs, imports, IMPORT_TYPE_DIRECT, arch ) ); strarray_addall( &all_libs, add_import_libs( make, &dep_libs, default_imports, IMPORT_TYPE_DEFAULT, arch ) ); if (!arch) strarray_addall( &all_libs, libs ); dll_name = arch_module_name( strmake( "%s%s", obj, ext ), arch ); obj_name = obj_dir_path( make, strmake( "%s%s.o", arch_dirs[arch], obj )); + if (link_arch != arch) + hybrid_obj_name = obj_dir_path( make, strmake( "%s%s.o", arch_dirs[link_arch], obj )); output_file = obj_dir_path( make, dll_name ); output_rsrc = strmake( "%s.res", dll_name );
@@ -3112,23 +3139,25 @@ static void output_source_testdll( struct makefile *make, struct incl_file *sour output( "%s:", output_file ); if (spec_file) output_filename( spec_file->filename ); output_filename( obj_name ); + if (hybrid_obj_name) output_filename( hybrid_obj_name ); if (res_name) output_filename( res_name ); output_filenames( dep_libs ); output_filename( tools_path( make, "winebuild" )); output_filename( tools_path( make, "winegcc" )); output( "\n" ); - output_winegcc_command( make, arch ); + output_winegcc_command( make, link_arch ); output_filename( "-s" ); output_filenames( dll_flags ); - if (arch) output_filenames( get_expanded_arch_var_array( make, "EXTRADLLFLAGS", arch )); + if (link_arch) output_filenames( get_expanded_arch_var_array( make, "EXTRADLLFLAGS", link_arch )); if (!strcmp( ext, ".dll" )) output_filename( "-shared" ); if (spec_file) output_filename( spec_file->filename ); output_filename( obj_name ); + if (hybrid_obj_name) output_filename( hybrid_obj_name ); if (res_name) output_filename( res_name ); - if ((debug_file = get_debug_file( make, dll_name, arch ))) + if ((debug_file = get_debug_file( make, dll_name, link_arch ))) output_filename( strmake( "-Wl,--debug-file,%s", obj_dir_path( make, debug_file ))); output_filenames( all_libs ); - output_filename( arch_make_variable( "LDFLAGS", arch )); + output_filename( arch_make_variable( "LDFLAGS", link_arch )); output( "\n" ); } } @@ -3340,9 +3369,9 @@ static void output_module( struct makefile *make, unsigned int arch ) const char *module_name; const char *debug_file; char *spec_file = NULL; - unsigned int i; + unsigned int i, link_arch;
- if (make->disabled[arch]) return; + if (!get_link_arch( make, arch, &link_arch )) return;
if (!make->is_exe) { @@ -3389,23 +3418,25 @@ static void output_module( struct makefile *make, unsigned int arch ) output( "%s:", obj_dir_path( make, module_name )); if (spec_file) output_filename( spec_file ); output_filenames_obj_dir( make, make->object_files[arch] ); + if (link_arch != arch) output_filenames_obj_dir( make, make->object_files[link_arch] ); output_filenames_obj_dir( make, make->res_files[arch] ); output_filenames( dep_libs ); output_filename( tools_path( make, "winebuild" )); output_filename( tools_path( make, "winegcc" )); output( "\n" ); - output_winegcc_command( make, arch ); + output_winegcc_command( make, link_arch ); if (arch) output_filename( "-Wl,--wine-builtin" ); if (!make->is_exe) output_filename( "-shared" ); if (spec_file) output_filename( spec_file ); output_filenames( make->extradllflags ); - if (arch) output_filenames( get_expanded_arch_var_array( make, "EXTRADLLFLAGS", arch )); + if (link_arch) output_filenames( get_expanded_arch_var_array( make, "EXTRADLLFLAGS", link_arch )); output_filenames_obj_dir( make, make->object_files[arch] ); + if (link_arch != arch) output_filenames_obj_dir( make, make->object_files[link_arch] ); output_filenames_obj_dir( make, make->res_files[arch] ); - debug_file = get_debug_file( make, module_name, arch ); + debug_file = get_debug_file( make, module_name, link_arch ); if (debug_file) output_filename( strmake( "-Wl,--debug-file,%s", obj_dir_path( make, debug_file ))); output_filenames( all_libs ); - output_filename( arch_make_variable( "LDFLAGS", arch )); + output_filename( arch_make_variable( "LDFLAGS", link_arch )); output( "\n" );
if (!make->data_only && !arch && unix_lib_supported) output_fake_module( make, spec_file ); @@ -3419,6 +3450,9 @@ static void output_import_lib( struct makefile *make, unsigned int arch ) { char *spec_file = src_dir_path( make, replace_extension( make->module, ".dll", ".spec" )); const char *name = strmake( "%slib%s.a", arch_dirs[arch], make->importlib ); + unsigned int hybrid_arch = hybrid_archs[arch]; + + if (native_archs[arch]) return;
strarray_add( &make->clean_files, name ); if (needs_delay_lib( make, arch )) @@ -3429,14 +3463,17 @@ static void output_import_lib( struct makefile *make, unsigned int arch ) } output( "%s: %s %s", obj_dir_path( make, name ), tools_path( make, "winebuild" ), spec_file ); output_filenames_obj_dir( make, make->implib_files[arch] ); + if (hybrid_arch) output_filenames_obj_dir( make, make->implib_files[hybrid_arch] ); output( "\n" ); output( "\t%s%s -w --implib -o $@", cmd_prefix( "BUILD" ), tools_path( make, "winebuild" ) ); if (!delay_load_flags[arch]) output_filename( "--without-dlltool" ); - output_filenames( target_flags[arch] ); + output_filenames( target_flags[hybrid_arch ? hybrid_arch : arch] ); if (make->is_win16) output_filename( "-m16" ); + if (hybrid_arch) output_filenames( hybrid_target_flags[hybrid_arch] ); output_filename( "--export" ); output_filename( spec_file ); output_filenames_obj_dir( make, make->implib_files[arch] ); + if (hybrid_arch) output_filenames_obj_dir( make, make->implib_files[hybrid_arch] ); output( "\n" );
add_install_rule( make, make->importlib, arch, name, @@ -3477,15 +3514,20 @@ static void output_unix_lib( struct makefile *make ) static void output_static_lib( struct makefile *make, unsigned int arch ) { const char *name = strmake( "%s%s", arch_dirs[arch], make->staticlib ); + unsigned int hybrid_arch = hybrid_archs[arch]; + + if (native_archs[arch]) return;
strarray_add( &make->clean_files, name ); output( "%s: %s", obj_dir_path( make, name ), tools_path( make, "winebuild" )); output_filenames_obj_dir( make, make->object_files[arch] ); + if (hybrid_arch) output_filenames_obj_dir( make, make->object_files[hybrid_arch] ); if (!arch) output_filenames_obj_dir( make, make->unixobj_files ); output( "\n" ); output( "\t%s%s -w --staticlib -o $@", cmd_prefix( "BUILD" ), tools_path( make, "winebuild" )); - output_filenames( target_flags[arch] ); + output_filenames( target_flags[hybrid_arch ? hybrid_arch : arch] ); output_filenames_obj_dir( make, make->object_files[arch] ); + if (hybrid_arch) output_filenames_obj_dir( make, make->object_files[hybrid_arch] ); if (!arch) output_filenames_obj_dir( make, make->unixobj_files ); output( "\n" ); if (!make->extlib) @@ -3507,6 +3549,9 @@ static void output_test_module( struct makefile *make, unsigned int arch ) struct strarray all_libs = empty_strarray; struct makefile *parent = get_parent_makefile( make ); const char *debug_file; + unsigned int link_arch; + + if (!get_link_arch( make, arch, &link_arch )) return;
strarray_addall( &all_libs, add_import_libs( make, &dep_libs, make->imports, IMPORT_TYPE_DIRECT, arch ) ); strarray_addall( &all_libs, add_import_libs( make, &dep_libs, default_imports, IMPORT_TYPE_DEFAULT, arch ) ); @@ -3514,27 +3559,30 @@ static void output_test_module( struct makefile *make, unsigned int arch ) strarray_add( &make->all_targets[arch], testmodule ); strarray_add( &make->clean_files, stripped ); output( "%s:\n", obj_dir_path( make, testmodule )); - output_winegcc_command( make, arch ); + output_winegcc_command( make, link_arch ); output_filenames( make->extradllflags ); output_filenames_obj_dir( make, make->object_files[arch] ); + if (link_arch != arch) output_filenames_obj_dir( make, make->object_files[link_arch] ); output_filenames_obj_dir( make, make->res_files[arch] ); if ((debug_file = get_debug_file( make, testmodule, arch ))) output_filename( strmake( "-Wl,--debug-file,%s", obj_dir_path( make, debug_file ))); output_filenames( all_libs ); - output_filename( arch_make_variable( "LDFLAGS", arch )); + output_filename( arch_make_variable( "LDFLAGS", link_arch )); output( "\n" ); output( "%s:\n", obj_dir_path( make, stripped )); - output_winegcc_command( make, arch ); + output_winegcc_command( make, link_arch ); output_filename( "-s" ); output_filename( strmake( "-Wb,-F,%s_test.exe", basemodule )); output_filenames( make->extradllflags ); output_filenames_obj_dir( make, make->object_files[arch] ); + if (link_arch != arch) output_filenames_obj_dir( make, make->object_files[link_arch] ); output_filenames_obj_dir( make, make->res_files[arch] ); output_filenames( all_libs ); - output_filename( arch_make_variable( "LDFLAGS", arch )); + output_filename( arch_make_variable( "LDFLAGS", link_arch )); output( "\n" ); output( "%s %s:", obj_dir_path( make, testmodule ), obj_dir_path( make, stripped )); output_filenames_obj_dir( make, make->object_files[arch] ); + if (link_arch != arch) output_filenames_obj_dir( make, make->object_files[link_arch] ); output_filenames_obj_dir( make, make->res_files[arch] ); output_filenames( dep_libs ); output_filename( tools_path( make, "winebuild" )); @@ -4347,6 +4395,17 @@ static int parse_option( const char *opt ) }
+/******************************************************************* + * find_pe_arch + */ +static unsigned int find_pe_arch( const char *arch ) +{ + unsigned int i; + for (i = 1; i < archs.count; i++) if (!strcmp( archs.str[i], arch )) return i; + return 0; +} + + /******************************************************************* * main */ @@ -4354,7 +4413,7 @@ int main( int argc, char *argv[] ) { const char *makeflags = getenv( "MAKEFLAGS" ); const char *target; - unsigned int i, j, arch; + unsigned int i, j, arch, ec_arch;
if (makeflags) parse_makeflags( makeflags );
@@ -4434,6 +4493,14 @@ int main( int argc, char *argv[] ) strarray_add( &archs, get_expanded_make_variable( top_makefile, "HOST_ARCH" )); strarray_addall( &archs, get_expanded_make_var_array( top_makefile, "PE_ARCHS" ));
+ /* check for ARM64X setup */ + if ((ec_arch = find_pe_arch( "arm64ec" )) && (arch = find_pe_arch( "aarch64" ))) + { + native_archs[ec_arch] = arch; + hybrid_archs[arch] = ec_arch; + strarray_add( &hybrid_target_flags[ec_arch], "-marm64x" ); + } + arch_dirs[0] = ""; arch_pe_dirs[0] = strmake( "%s-windows/", archs.str[0] ); arch_install_dirs[0] = unix_lib_supported ? strmake( "$(dlldir)/%s-unix/", archs.str[0] ) : "$(dlldir)/"; diff --git a/tools/tools.h b/tools/tools.h index 5372b5bd303..076f22d7dad 100644 --- a/tools/tools.h +++ b/tools/tools.h @@ -573,7 +573,7 @@ static inline const char *get_arch_dir( struct target target ) [CPU_x86_64] = "x86_64", [CPU_ARM] = "arm", [CPU_ARM64] = "aarch64", - [CPU_ARM64EC] = "arm64ec", + [CPU_ARM64EC] = "aarch64", };
if (!cpu_names[target.cpu]) return "";
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=144925
Your paranoid android.
=== debian11b (64 bit WoW report) ===
ws2_32: protocol.c:2479: Test succeeded inside todo block: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 0: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 1: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 2: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 3: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 4: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 5: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 12: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 13: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 14: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 15: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 16: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 28: IPv6 address is returned. protocol.c:2497: Test succeeded inside todo block: Test 29: IPv6 address is returned.