[PATCH v1] Fix build break when LTO is enabled

Chenxi Mao posted 1 patch 1 month ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20251009070010.1863345-1-maochenxi@bosc.ac.cn
Maintainers: Kevin Wolf <kwolf@redhat.com>, Hanna Reitz <hreitz@redhat.com>, Viktor Prutyanov <viktor.prutyanov@phystech.edu>, Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
block/curl.c               | 12 ++++++------
contrib/elf2dmp/download.c |  4 ++--
2 files changed, 8 insertions(+), 8 deletions(-)
[PATCH v1] Fix build break when LTO is enabled
Posted by Chenxi Mao 1 month ago
QEMU build fails when LTO is enabled:
../configure --target-list=riscv64-softmmu --enable-lto
make

Several errors occur due to incorrect curl_easy_setopt usage:

../contrib/elf2dmp/download.c:30:16: error: call to ‘_curl_easy_setopt_err_long’ declared with attribute warning: curl_easy_setopt expects a long argument [-Werror=attribute-warning]
   30 |             || curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1) != CURLE_OK
      |                ^
lto1: all warnings being treated as errors
../block/curl.c: In function ‘curl_open’:
../block/curl.c:806:9: error: call to ‘_curl_easy_setopt_err_long’ declared with attribute warning: curl_easy_setopt expects a long argument [-Werror=attribute-warning]
  806 |     if (curl_easy_setopt(state->curl, CURLOPT_NOBODY, 1) ||
      |         ^
lto1: all warnings being treated as errors

The third parameter of curl_easy_setopt should be of long type.
Change integer constants to long by adding 'L' suffix.

After this change, build passes and runs without errors.

Signed-off-by: Chenxi Mao <maochenxi@bosc.ac.cn>
---
 block/curl.c               | 12 ++++++------
 contrib/elf2dmp/download.c |  4 ++--
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/block/curl.c b/block/curl.c
index e0f98e035a..d7d93d967f 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -471,11 +471,11 @@ static int curl_init_state(BDRVCURLState *s, CURLState *state)
                              (void *)curl_read_cb) ||
             curl_easy_setopt(state->curl, CURLOPT_WRITEDATA, (void *)state) ||
             curl_easy_setopt(state->curl, CURLOPT_PRIVATE, (void *)state) ||
-            curl_easy_setopt(state->curl, CURLOPT_AUTOREFERER, 1) ||
-            curl_easy_setopt(state->curl, CURLOPT_FOLLOWLOCATION, 1) ||
-            curl_easy_setopt(state->curl, CURLOPT_NOSIGNAL, 1) ||
+            curl_easy_setopt(state->curl, CURLOPT_AUTOREFERER, 1L) ||
+            curl_easy_setopt(state->curl, CURLOPT_FOLLOWLOCATION, 1L) ||
+            curl_easy_setopt(state->curl, CURLOPT_NOSIGNAL, 1L) ||
             curl_easy_setopt(state->curl, CURLOPT_ERRORBUFFER, state->errmsg) ||
-            curl_easy_setopt(state->curl, CURLOPT_FAILONERROR, 1)) {
+            curl_easy_setopt(state->curl, CURLOPT_FAILONERROR, 1L)) {
             goto err;
         }
         if (s->username) {
@@ -524,7 +524,7 @@ static int curl_init_state(BDRVCURLState *s, CURLState *state)
 #endif
 
 #ifdef DEBUG_VERBOSE
-        if (curl_easy_setopt(state->curl, CURLOPT_VERBOSE, 1)) {
+        if (curl_easy_setopt(state->curl, CURLOPT_VERBOSE, 1L)) {
             goto err;
         }
 #endif
@@ -800,7 +800,7 @@ static int curl_open(BlockDriverState *bs, QDict *options, int flags,
     }
 
     s->accept_range = false;
-    if (curl_easy_setopt(state->curl, CURLOPT_NOBODY, 1) ||
+    if (curl_easy_setopt(state->curl, CURLOPT_NOBODY, 1L) ||
         curl_easy_setopt(state->curl, CURLOPT_HEADERFUNCTION, curl_header_cb) ||
         curl_easy_setopt(state->curl, CURLOPT_HEADERDATA, s)) {
         pstrcpy(state->errmsg, CURL_ERROR_SIZE,
diff --git a/contrib/elf2dmp/download.c b/contrib/elf2dmp/download.c
index 21306b3fd4..fa8da0f9a2 100644
--- a/contrib/elf2dmp/download.c
+++ b/contrib/elf2dmp/download.c
@@ -27,8 +27,8 @@ bool download_url(const char *name, const char *url)
     if (curl_easy_setopt(curl, CURLOPT_URL, url) != CURLE_OK
             || curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL) != CURLE_OK
             || curl_easy_setopt(curl, CURLOPT_WRITEDATA, file) != CURLE_OK
-            || curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1) != CURLE_OK
-            || curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0) != CURLE_OK
+            || curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L) != CURLE_OK
+            || curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L) != CURLE_OK
             || curl_easy_perform(curl) != CURLE_OK) {
         unlink(name);
         fclose(file);
-- 
2.47.3


Re: [PATCH v1] Fix build break when LTO is enabled
Posted by Peter Maydell 1 month ago
On Thu, 9 Oct 2025 at 14:15, Chenxi Mao <maochenxi@bosc.ac.cn> wrote:
>
> QEMU build fails when LTO is enabled:
> ../configure --target-list=riscv64-softmmu --enable-lto
> make
>
> Several errors occur due to incorrect curl_easy_setopt usage:
>
> ../contrib/elf2dmp/download.c:30:16: error: call to ‘_curl_easy_setopt_err_long’ declared with attribute warning: curl_easy_setopt expects a long argument [-Werror=attribute-warning]
>    30 |             || curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1) != CURLE_OK
>       |                ^
> lto1: all warnings being treated as errors
> ../block/curl.c: In function ‘curl_open’:
> ../block/curl.c:806:9: error: call to ‘_curl_easy_setopt_err_long’ declared with attribute warning: curl_easy_setopt expects a long argument [-Werror=attribute-warning]
>   806 |     if (curl_easy_setopt(state->curl, CURLOPT_NOBODY, 1) ||
>       |         ^
> lto1: all warnings being treated as errors
>
> The third parameter of curl_easy_setopt should be of long type.
> Change integer constants to long by adding 'L' suffix.
>
> After this change, build passes and runs without errors.
>
> Signed-off-by: Chenxi Mao <maochenxi@bosc.ac.cn>

Hi; there's already a patch on list for this:

https://patchew.org/QEMU/20251001124055.2743244-1-rjones@redhat.com/

Looks like that missed the elf2dmp usage though:

> diff --git a/contrib/elf2dmp/download.c b/contrib/elf2dmp/download.c
> index 21306b3fd4..fa8da0f9a2 100644
> --- a/contrib/elf2dmp/download.c
> +++ b/contrib/elf2dmp/download.c
> @@ -27,8 +27,8 @@ bool download_url(const char *name, const char *url)
>      if (curl_easy_setopt(curl, CURLOPT_URL, url) != CURLE_OK
>              || curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL) != CURLE_OK
>              || curl_easy_setopt(curl, CURLOPT_WRITEDATA, file) != CURLE_OK
> -            || curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1) != CURLE_OK
> -            || curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0) != CURLE_OK
> +            || curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L) != CURLE_OK
> +            || curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L) != CURLE_OK
>              || curl_easy_perform(curl) != CURLE_OK) {
>          unlink(name);
>          fclose(file);


thanks
-- PMM
Re: [PATCH v1] Fix build break when LTO is enabled
Posted by Richard W.M. Jones 1 month ago
On Thu, Oct 09, 2025 at 02:32:00PM +0100, Peter Maydell wrote:
> On Thu, 9 Oct 2025 at 14:15, Chenxi Mao <maochenxi@bosc.ac.cn> wrote:
> >
> > QEMU build fails when LTO is enabled:
> > ../configure --target-list=riscv64-softmmu --enable-lto
> > make
...
> Hi; there's already a patch on list for this:
> 
> https://patchew.org/QEMU/20251001124055.2743244-1-rjones@redhat.com/

And it's nothing to do with LTO.  This is caused by an update in curl
which fixed some (already crazy) compiler macros to detect this stuff:

https://github.com/curl/curl/commit/79b4e56b3f30dc1ac28a81128a07d27338e5219e

> Looks like that missed the elf2dmp usage though:

I'll post an update with Chenxi Mao's S-O-B attached, in a minute.

Rich.

> > diff --git a/contrib/elf2dmp/download.c b/contrib/elf2dmp/download.c
> > index 21306b3fd4..fa8da0f9a2 100644
> > --- a/contrib/elf2dmp/download.c
> > +++ b/contrib/elf2dmp/download.c
> > @@ -27,8 +27,8 @@ bool download_url(const char *name, const char *url)
> >      if (curl_easy_setopt(curl, CURLOPT_URL, url) != CURLE_OK
> >              || curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL) != CURLE_OK
> >              || curl_easy_setopt(curl, CURLOPT_WRITEDATA, file) != CURLE_OK
> > -            || curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1) != CURLE_OK
> > -            || curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0) != CURLE_OK
> > +            || curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L) != CURLE_OK
> > +            || curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L) != CURLE_OK
> >              || curl_easy_perform(curl) != CURLE_OK) {
> >          unlink(name);
> >          fclose(file);
> 
> 
> thanks
> -- PMM

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v