Revert an upstream change to tools/winebuild/res32.c that exposed resource contraints for clang on i386 (cf. the upstream reports at https://github.com/llvm/llvm-project/issues/62339 and https://bugs.winehq.org/show_bug.cgi?id=54889 ). Apply this patch only on i386 to minimize divergence and risk on 64-bit x86. PR: 273987 [1], 271201 [2] Bi-sected by: Damjan Jovanovic <damjan.jov@gmail.com> [2] Motivated by: scf [1]
96 lines
3.2 KiB
Plaintext
96 lines
3.2 KiB
Plaintext
The upstream change
|
|
|
|
commit 0b3f90ab1485d5bd32bd72d41c7fd8213b3b95b9
|
|
Author: Rémi Bernon <rbernon@codeweavers.com>
|
|
Date: Sat Feb 11 11:05:22 2023 +0100
|
|
|
|
winebuild: Use .incbin instead of printf for resource data.
|
|
|
|
apparently causes some (not completely reproducible) build
|
|
issues on i386 due to resource exhaustion by the compiler,
|
|
cf. https://bugs.winehq.org/show_bug.cgi?id=54889 .
|
|
|
|
https://github.com/llvm/llvm-project/issues/62339 tracks this on
|
|
the LLVM side, alas has not really seen progress since April 2003.
|
|
So for now this reverts the upstream commit (alas on i386 only as
|
|
to minimize divergence and risk on 64-bit x86).
|
|
|
|
|
|
--- tools/winebuild/res32.c
|
|
+++ tools/winebuild/res32.c
|
|
@@ -44,8 +44,6 @@ struct resource
|
|
{
|
|
struct string_id type;
|
|
struct string_id name;
|
|
- const char *input_name;
|
|
- unsigned int input_offset;
|
|
const void *data;
|
|
unsigned int data_size;
|
|
unsigned int data_offset;
|
|
@@ -158,6 +156,28 @@ static void put_string( const struct string_id *str )
|
|
}
|
|
}
|
|
|
|
+static void dump_res_data( const struct resource *res )
|
|
+{
|
|
+ unsigned int i = 0;
|
|
+ unsigned int size = (res->data_size + 3) & ~3;
|
|
+
|
|
+ if (!size) return;
|
|
+
|
|
+ input_buffer = res->data;
|
|
+ input_buffer_pos = 0;
|
|
+ input_buffer_size = size;
|
|
+
|
|
+ output( "\t.long " );
|
|
+ while (size > 4)
|
|
+ {
|
|
+ if ((i++ % 16) == 15) output( "0x%08x\n\t.long ", get_dword() );
|
|
+ else output( "0x%08x,", get_dword() );
|
|
+ size -= 4;
|
|
+ }
|
|
+ output( "0x%08x\n", get_dword() );
|
|
+ assert( input_buffer_pos == input_buffer_size );
|
|
+}
|
|
+
|
|
/* check the file header */
|
|
/* all values must be zero except header size */
|
|
static int check_header(void)
|
|
@@ -179,7 +199,7 @@ static int check_header(void)
|
|
}
|
|
|
|
/* load the next resource from the current file */
|
|
-static void load_next_resource( DLLSPEC *spec, const char *name )
|
|
+static void load_next_resource( DLLSPEC *spec )
|
|
{
|
|
unsigned int hdr_size;
|
|
struct resource *res = add_resource( spec );
|
|
@@ -189,9 +209,6 @@ static void load_next_resource( DLLSPEC *spec, const char *name )
|
|
if (hdr_size & 3) fatal_error( "%s header size not aligned\n", input_buffer_filename );
|
|
if (hdr_size < 32) fatal_error( "%s invalid header size %u\n", input_buffer_filename, hdr_size );
|
|
|
|
- res->input_name = xstrdup( name );
|
|
- res->input_offset = input_buffer_pos - 2*sizeof(unsigned int) + hdr_size;
|
|
-
|
|
res->data = input_buffer + input_buffer_pos - 2*sizeof(unsigned int) + hdr_size;
|
|
if ((const unsigned char *)res->data < input_buffer ||
|
|
(const unsigned char *)res->data >= input_buffer + input_buffer_size)
|
|
@@ -220,7 +237,7 @@ int load_res32_file( const char *name, DLLSPEC *spec )
|
|
|
|
if ((ret = check_header()))
|
|
{
|
|
- while (input_buffer_pos < input_buffer_size) load_next_resource( spec, name );
|
|
+ while (input_buffer_pos < input_buffer_size) load_next_resource( spec );
|
|
}
|
|
return ret;
|
|
}
|
|
@@ -473,7 +490,7 @@ void output_resources( DLLSPEC *spec )
|
|
{
|
|
output( "\n\t.balign 4\n" );
|
|
output( ".L__wine_spec_res_%d:\n", i );
|
|
- output( "\t.incbin \"%s\",%d,%d\n", res->input_name, res->input_offset, res->data_size );
|
|
+ dump_res_data( res );
|
|
}
|
|
|
|
if (!is_pe())
|