Hi, this patch fixes some minor problems in lto-plugin:
Some older mingw32 host environments have broken asprintf. As far as I can tell, the problem is that the mingw asprintf implementation calls _vsnprintf (NULL, 0, ...) which always returns -1 as length on the host. The patch fixes this by using xasprintf from libiberty with the additional benefit of easier use and unified error reporting in the case when there is actually no more memory available, i.e. it will use the same error massages like xmalloc then. Moreover, the old implementation calls asprintf as > asprintf (&objname, "%s@0x%x%08x", file->name, lo, hi) for large archives when the high 32 bits (hi) are non-zero. This looks like a typo: the high part must come first to yiels a proper 64-bit value. Bootstrapped & re-tested on x86_64-linux gnu and also on mingw32 which popped the "ld.exe: asprintf failed". Ok for trunk? Johann lto-plugin/ PR lto/81487 * lto-plugin.c (claim_file_handler): Use xasprintf instead of asprintf. [hi!=0]: Swap hi and lo arguments supplied to xasprintf.
Index: lto-plugin/lto-plugin.c =================================================================== --- lto-plugin/lto-plugin.c (revision 250302) +++ lto-plugin/lto-plugin.c (working copy) @@ -975,17 +975,16 @@ claim_file_handler (const struct ld_plug if (file->offset != 0) { - char *objname; /* We pass the offset of the actual file, not the archive header. Can't use PRIx64, because that's C99, so we have to print the - 64-bit hex int as two 32-bit ones. */ - int lo, hi, t; + 64-bit hex int as two 32-bit ones. Use xasprintf instead of + asprintf because asprintf doesn't work as expected on some older + mingw32 hosts. */ + int lo, hi; lo = file->offset & 0xffffffff; hi = ((int64_t)file->offset >> 32) & 0xffffffff; - t = hi ? asprintf (&objname, "%s@0x%x%08x", file->name, lo, hi) - : asprintf (&objname, "%s@0x%x", file->name, lo); - check (t >= 0, LDPL_FATAL, "asprintf failed"); - lto_file.name = objname; + lto_file.name = hi ? xasprintf ("%s@0x%x%08x", file->name, hi, lo) + : xasprintf ("%s@0x%x", file->name, lo); } else {