Skip to content

binaryen fails to build from source with LTO (link time optimization) enabled #5946

Closed

Description

@apoleon

Hi

I'm hereby forwarding Debian bug #1015358

Version: 116
OS: Debian unstable
Compiler: GCC 13

Debian wants to enable link time optimization in the near future but binaryen 116 fails to build from source when LTO is enabled.

The error seems to be caused by third party code in third_party/llvm-project

third_party/llvm-project/./third_party/llvm-project/include/llvm/ADT/edit_distance.h: In function ‘ComputeEditDistance’:
third_party/llvm-project/./third_party/llvm-project/include/llvm/ADT/edit_distance.h:96:12: error: ‘SmallBuffer’ may be used uninitialized [-Werror=maybe-uninitialized]
third_party/llvm-project/./third_party/llvm-project/include/llvm/ADT/edit_distance.h:61:12: note: ‘SmallBuffer’ declared here
lto1: all warnings being treated as errors
make[4]: *** [/tmp/ccrE0idZ.mk:365: /tmp/ccqqy1Bf.ltrans121.ltrans.o] Error 1
make[4]: *** Waiting for unfinished jobs....
lto-wrapper: fatal error: make returned 2 exit status
compilation terminated.
/usr/bin/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status

Activity

  1. kripken commented on Sep 18, 2023

    @kripken
    Member

    Would it be possible to build there with -DBUILD_LLVM_DWARF=OFF? That would disable using this third-party code, which is only used for Binaryen's partial DWARF support (edit: because it's partial, I don't think many people actually depend on it. we don't build it into binaryen.js for example).

  2. apoleon commented on Sep 18, 2023

    @apoleon
    ContributorAuthor

    Hi,
    then I get another error because Allocator.h is part of the disabled llvm-project directory

    In file included from /<<PKGBUILDDIR>>/src/support/suffix_tree.cpp:16:
    /<<PKGBUILDDIR>>/src/support/suffix_tree.h:38:10: fatal error: llvm/Support/Allocator.h: No such file or directory
       38 | #include "llvm/Support/Allocator.h"
          |          ^~~~~~~~~~~~~~~~~~~~~~~~~~
    
  3. kripken commented on Sep 18, 2023

    @kripken
    Member

    Hmm, looks related to @ashleynh's work on the suffix tree. Building just that without LLVM errors it seems. Looks like we don't have a flag to disable the suffix tree, and instead we manually disable it in binaryen.js (emscripten) builds, which do not build LLVM:

    # The below condition is intended for removal once the suffix_tree and
    # suffix_tree_node source files no longer depend on LLVM code in the
    # third_party folder
    if(EMSCRIPTEN)
    add_library(support OBJECT ${support_SOURCES})
    else()
    set(support_with_suffix_tree_SOURCES
    suffix_tree.cpp
    suffix_tree_node.cpp
    ${support_SOURCES}
    )
    add_library(support OBJECT ${support_with_suffix_tree_SOURCES})
    endif()

    Perhaps we should add such a flag? Another option might be to find a workaround in that source file. I'm not sure how to do that, though, since LTO shouldn't affect compile-time errors... so that error is odd. But @apoleon , does this patch fix things for you?

    diff --git a/third_party/llvm-project/include/llvm/ADT/edit_distance.h b/third_party/llvm-project/include/llvm/ADT/edit_distance.h
    index 4f5134008..784547108 100644
    --- a/third_party/llvm-project/include/llvm/ADT/edit_distance.h
    +++ b/third_party/llvm-project/include/llvm/ADT/edit_distance.h
    @@ -19,6 +19,11 @@
     #include <algorithm>
     #include <memory>
     
    +// XXX BINARYEN avoid a compiler warning here
    +//     https://github.com/WebAssembly/binaryen/issues/5946
    +#pragma GCC diagnostic push
    +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
    +
     namespace llvm {
     
     /// Determine the edit distance between two sequences.
    @@ -99,4 +104,7 @@ unsigned ComputeEditDistance(ArrayRef<T> FromArray, ArrayRef<T> ToArray,
     
     } // End llvm namespace
     
    +// XXX BINARYEN
    +#pragma GCC diagnostic pop
    +
     #endif

    If it works then it might be the quickest fix here.

  4. apoleon commented on Sep 18, 2023

    @apoleon
    ContributorAuthor

    The patch didn't make a difference for me. I still get the same error. But when I set the ENABLE_WERROR flag in CMakeLists to OFF instead, it works. Maybe there is a better solution but as a quick workaround it already helps.

  5. rathann commented on Feb 26, 2025

    @rathann
    Contributor

    I suggest building with -DENABLE_WERROR=OFF instead. We do that on Fedora.

  6. tlively commented on Mar 3, 2025

    @tlively
    Member

    Closing this because turning Werror off is pretty much the only correct solution in situations like this.

  7. GulgDev commented on Apr 9, 2025

    @GulgDev
    Contributor

    I get this error when building on Windows like this:

    cmake . -DENABLE_WERROR=OFF
    make
    
  8. tlively commented on Apr 9, 2025

    @tlively
    Member

    @GulgDev, can you open a new issue with details about your build config and the error you're getting?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions