[llvm] r220462 - Add llvm-go tool.

David Blaikie dblaikie at gmail.com
Tue Nov 25 17:11:12 PST 2014


On Wed, Oct 22, 2014 at 7:33 PM, Peter Collingbourne <peter at pcc.me.uk>
wrote:

> Author: pcc
> Date: Wed Oct 22 21:33:23 2014
> New Revision: 220462
>
> URL: http://llvm.org/viewvc/llvm-project?rev=220462&view=rev
> Log:
> Add llvm-go tool.
>
> This tool lets us build LLVM components within the tree by setting up a
> $GOPATH that resembles a tree fetched in the normal way with "go get".
>
> It is intended that components such as the Go frontend will be built
> in-tree
> using this tool.
>
> Differential Revision: http://reviews.llvm.org/D5902
>
> Added:
>     llvm/trunk/tools/llvm-go/
>     llvm/trunk/tools/llvm-go/CMakeLists.txt
>     llvm/trunk/tools/llvm-go/Makefile
>     llvm/trunk/tools/llvm-go/llvm-go.go
> Modified:
>     llvm/trunk/bindings/go/build.sh
>     llvm/trunk/cmake/config-ix.cmake
>     llvm/trunk/test/Bindings/Go/go.test
>

Anyone else seeing a failure with this test?

******************** TEST 'LLVM :: Bindings/Go/go.test' FAILED
********************
Script:
--
.../llvm/build/clang/debug/split/notypes/nostandalone/./bin/llvm-go
test llvm.org/llvm/bindings/go/llvm
--
Exit Code: 1

Command Output (stdout):
--
llvm.test: .../llvm/src/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp:279:
void llvm::RuntimeDyldELF::resolveX86_64Relocati
on(const llvm::SectionEntry &, uint64_t, uint64_t, uint32_t, int64_t,
uint64_t): Assertion `(Type == ELF::R_X86_64_32 && (Value <=
(4294967295U))) || (Type ==
ELF::R_X86_64_32S && ((int64_t)Value <= (2147483647) && (int64_t)Value
>= (-2147483647-1)))' failed.
SIGABRT: abort
PC=0x7f1d88da3bb9
...



>     llvm/trunk/test/CMakeLists.txt
>     llvm/trunk/test/lit.cfg
>     llvm/trunk/tools/CMakeLists.txt
>     llvm/trunk/tools/Makefile
>
> Modified: llvm/trunk/bindings/go/build.sh
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/go/build.sh?rev=220462&r1=220461&r2=220462&view=diff
>
> ==============================================================================
> --- llvm/trunk/bindings/go/build.sh (original)
> +++ llvm/trunk/bindings/go/build.sh Wed Oct 22 21:33:23 2014
> @@ -1,36 +1,5 @@
>  #!/bin/sh -xe
>
> -llvm_components="\
> -all-targets \
> -analysis \
> -asmparser \
> -asmprinter \
> -bitreader \
> -bitwriter \
> -codegen \
> -core \
> -debuginfo \
> -executionengine \
> -instrumentation \
> -interpreter \
> -ipo \
> -irreader \
> -linker \
> -mc \
> -mcjit \
> -objcarcopts \
> -option \
> -profiledata \
> -scalaropts \
> -support \
> -target \
> -"
> -
> -if [ "$1" = "--print-components" ] ; then
> -  echo $llvm_components
> -  exit 0
> -fi
> -
>  gollvmdir=$(dirname "$0")/llvm
>
>  workdir=$gollvmdir/workdir
> @@ -41,12 +10,14 @@ mkdir -p $llvm_builddir
>
>  cmake_flags="../../../../.. $@"
>  llvm_config="$llvm_builddir/bin/llvm-config"
> +llvm_go="$llvm_builddir/bin/llvm-go"
>
>  if test -n "`which ninja`" ; then
>    # If Ninja is available, we can speed up the build by building only the
>    # required subset of LLVM.
>    (cd $llvm_builddir && cmake -G Ninja $cmake_flags)
> -  ninja -C $llvm_builddir llvm-config
> +  ninja -C $llvm_builddir llvm-config llvm-go
> +  llvm_components="$($llvm_go print-components)"
>    llvm_buildtargets="$($llvm_config --libs $llvm_components | sed -e
> 's/-l//g')"
>    ninja -C $llvm_builddir $llvm_buildtargets FileCheck
>  else
> @@ -54,14 +25,7 @@ else
>    make -C $llvm_builddir -j4
>  fi
>
> +$llvm_go print-config > $gollvmdir/llvm_config.go
> +
>  llvm_version="$($llvm_config --version)"
> -llvm_cflags="$($llvm_config --cppflags)"
> -llvm_ldflags="$($llvm_config --ldflags) $($llvm_config --libs
> $llvm_components) $($llvm_config --system-libs)"
> -if [ $(uname) != "Darwin" ]; then
> -  # OS X doesn't like -rpath with cgo. See:
> -  # https://code.google.com/p/go/issues/detail?id=7293
> -  llvm_ldflags="-Wl,-rpath,$($llvm_config --libdir) $llvm_ldflags"
> -fi
> -sed -e "s#@LLVM_CFLAGS@#$llvm_cflags#g; s#@LLVM_LDFLAGS@#$llvm_ldflags#g"
> $gollvmdir/llvm_config.go.in > \
> -  $gollvmdir/llvm_config.go
>  printf "package llvm\n\nconst Version = \"%s\"\n" "$llvm_version" >
> $gollvmdir/version.go
>
> Modified: llvm/trunk/cmake/config-ix.cmake
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/cmake/config-ix.cmake?rev=220462&r1=220461&r2=220462&view=diff
>
> ==============================================================================
> --- llvm/trunk/cmake/config-ix.cmake (original)
> +++ llvm/trunk/cmake/config-ix.cmake Wed Oct 22 21:33:23 2014
> @@ -493,16 +493,20 @@ else()
>  endif()
>
>  set(LLVM_BINDINGS "")
> -find_program(GO_EXECUTABLE NAMES go DOC "go executable")
> -if(GO_EXECUTABLE STREQUAL "GO_EXECUTABLE-NOTFOUND")
> +if(WIN32)
>    message(STATUS "Go bindings disabled.")
>  else()
> -  execute_process(COMMAND ${GO_EXECUTABLE} run
> ${CMAKE_SOURCE_DIR}/bindings/go/conftest.go
> -                  RESULT_VARIABLE GO_CONFTEST)
> -  if(GO_CONFTEST STREQUAL "0")
> -    set(LLVM_BINDINGS "${LLVM_BINDINGS} go")
> -    message(STATUS "Go bindings enabled.")
> +  find_program(GO_EXECUTABLE NAMES go DOC "go executable")
> +  if(GO_EXECUTABLE STREQUAL "GO_EXECUTABLE-NOTFOUND")
> +    message(STATUS "Go bindings disabled.")
>    else()
> -    message(STATUS "Go bindings disabled, need at least Go 1.2.")
> +    execute_process(COMMAND ${GO_EXECUTABLE} run
> ${CMAKE_SOURCE_DIR}/bindings/go/conftest.go
> +                    RESULT_VARIABLE GO_CONFTEST)
> +    if(GO_CONFTEST STREQUAL "0")
> +      set(LLVM_BINDINGS "${LLVM_BINDINGS} go")
> +      message(STATUS "Go bindings enabled.")
> +    else()
> +      message(STATUS "Go bindings disabled, need at least Go 1.2.")
> +    endif()
>    endif()
>  endif()
>
> Modified: llvm/trunk/test/Bindings/Go/go.test
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bindings/Go/go.test?rev=220462&r1=220461&r2=220462&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Bindings/Go/go.test (original)
> +++ llvm/trunk/test/Bindings/Go/go.test Wed Oct 22 21:33:23 2014
> @@ -1,8 +1,3 @@
> -; RUN: cd %S/../../../bindings/go/llvm && \
> -; RUN: env CGO_CPPFLAGS="$(llvm-config --cppflags)" \
> -; RUN:     CGO_CXXFLAGS=-std=c++11 \
> -; RUN:     CGO_LDFLAGS="$(llvm-config --ldflags --libs --system-libs \
> -; RUN:                                $(../build.sh --print-components))
> $CGO_LDFLAGS" \
> -; RUN:     %go test -tags byollvm .
> +; RUN: llvm-go test llvm.org/llvm/bindings/go/llvm
>
>  ; REQUIRES: shell
>
> Modified: llvm/trunk/test/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CMakeLists.txt?rev=220462&r1=220461&r2=220462&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CMakeLists.txt (original)
> +++ llvm/trunk/test/CMakeLists.txt Wed Oct 22 21:33:23 2014
> @@ -30,8 +30,9 @@ set(LLVM_TEST_DEPENDS
>            llvm-cov
>            llvm-diff
>            llvm-dis
> -          llvm-extract
>            llvm-dwarfdump
> +          llvm-extract
> +          llvm-go
>            llvm-link
>            llvm-lto
>            llvm-mc
>
> Modified: llvm/trunk/test/lit.cfg
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/lit.cfg?rev=220462&r1=220461&r2=220462&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/lit.cfg (original)
> +++ llvm/trunk/test/lit.cfg Wed Oct 22 21:33:23 2014
> @@ -200,6 +200,7 @@ for pattern in [r"\bbugpoint\b(?!-)",
>                  r"\bllvm-dis\b",
>                  r"\bllvm-dwarfdump\b",
>                  r"\bllvm-extract\b",
> +                r"\bllvm-go\b",
>                  r"\bllvm-link\b",
>                  r"\bllvm-lto\b",
>                  r"\bllvm-mc\b",
>
> Modified: llvm/trunk/tools/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/CMakeLists.txt?rev=220462&r1=220461&r2=220462&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/CMakeLists.txt (original)
> +++ llvm/trunk/tools/CMakeLists.txt Wed Oct 22 21:33:23 2014
> @@ -52,6 +52,8 @@ add_llvm_tool_subdirectory(llvm-c-test)
>  add_llvm_tool_subdirectory(obj2yaml)
>  add_llvm_tool_subdirectory(yaml2obj)
>
> +add_llvm_tool_subdirectory(llvm-go)
> +
>  if(NOT CYGWIN AND LLVM_ENABLE_PIC)
>    add_llvm_tool_subdirectory(lto)
>    add_llvm_tool_subdirectory(llvm-lto)
>
> Modified: llvm/trunk/tools/Makefile
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/Makefile?rev=220462&r1=220461&r2=220462&view=diff
>
> ==============================================================================
> --- llvm/trunk/tools/Makefile (original)
> +++ llvm/trunk/tools/Makefile Wed Oct 22 21:33:23 2014
> @@ -74,4 +74,8 @@ ifneq ($(ENABLE_SHARED),1)
>    endif
>  endif
>
> +ifneq (,$(filter go,$(BINDINGS_TO_BUILD)))
> +  PARALLEL_DIRS += llvm-go
> +endif
> +
>  include $(LEVEL)/Makefile.common
>
> Added: llvm/trunk/tools/llvm-go/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-go/CMakeLists.txt?rev=220462&view=auto
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-go/CMakeLists.txt (added)
> +++ llvm/trunk/tools/llvm-go/CMakeLists.txt Wed Oct 22 21:33:23 2014
> @@ -0,0 +1,9 @@
> +if(LLVM_BINDINGS MATCHES "go")
> +  set(binpath ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX})
> +  add_custom_command(OUTPUT ${binpath}
> +    COMMAND ${GO_EXECUTABLE} build -o ${binpath} llvm-go.go
> +    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/llvm-go.go
> +    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
> +    COMMENT "Building Go executable llvm-go")
> +  add_custom_target(llvm-go ALL DEPENDS ${binpath})
> +endif()
>
> Added: llvm/trunk/tools/llvm-go/Makefile
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-go/Makefile?rev=220462&view=auto
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-go/Makefile (added)
> +++ llvm/trunk/tools/llvm-go/Makefile Wed Oct 22 21:33:23 2014
> @@ -0,0 +1,16 @@
> +##===- tools/llvm-go/Makefile ------------------------------*- Makefile
> -*-===##
> +#
> +#                     The LLVM Compiler Infrastructure
> +#
> +# This file is distributed under the University of Illinois Open Source
> +# License. See LICENSE.TXT for details.
> +#
>
> +##===----------------------------------------------------------------------===##
> +
> +LEVEL := ../..
> +include $(LEVEL)/Makefile.common
> +
> +all:: $(ToolDir)/llvm-go$(EXEEXT)
> +
> +$(ToolDir)/llvm-go$(EXEEXT): $(PROJ_SRC_DIR)/llvm-go.go
> +       $(GO) build -o $@ $<
>
> Added: llvm/trunk/tools/llvm-go/llvm-go.go
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-go/llvm-go.go?rev=220462&view=auto
>
> ==============================================================================
> --- llvm/trunk/tools/llvm-go/llvm-go.go (added)
> +++ llvm/trunk/tools/llvm-go/llvm-go.go Wed Oct 22 21:33:23 2014
> @@ -0,0 +1,261 @@
> +//===-- llvm-go.go - go tool wrapper for LLVM
> -----------------------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
>
> +//===----------------------------------------------------------------------===//
> +//
> +// This tool lets us build LLVM components within the tree by setting up a
> +// $GOPATH that resembles a tree fetched in the normal way with "go get".
> +//
>
> +//===----------------------------------------------------------------------===//
> +
> +package main
> +
> +import (
> +       "fmt"
> +       "io/ioutil"
> +       "os"
> +       "os/exec"
> +       "path/filepath"
> +       "runtime"
> +       "strings"
> +)
> +
> +type pkg struct {
> +       llvmpath, pkgpath string
> +}
> +
> +var packages = []pkg{
> +       {"bindings/go/llvm", "llvm.org/llvm/bindings/go/llvm"},
> +}
> +
> +type compilerFlags struct {
> +       cpp, cxx, ld string
> +}
> +
> +var components = []string{
> +       "all-targets",
> +       "analysis",
> +       "asmparser",
> +       "asmprinter",
> +       "bitreader",
> +       "bitwriter",
> +       "codegen",
> +       "core",
> +       "debuginfo",
> +       "executionengine",
> +       "instrumentation",
> +       "interpreter",
> +       "ipo",
> +       "irreader",
> +       "linker",
> +       "mc",
> +       "mcjit",
> +       "objcarcopts",
> +       "option",
> +       "profiledata",
> +       "scalaropts",
> +       "support",
> +       "target",
> +}
> +
> +func llvmConfig(args ...string) string {
> +       configpath := os.Getenv("LLVM_CONFIG")
> +       if configpath == "" {
> +               // strip llvm-go, add llvm-config
> +               configpath = os.Args[0][:len(os.Args[0])-7] + "llvm-config"
> +       }
> +
> +       cmd := exec.Command(configpath, args...)
> +       out, err := cmd.Output()
> +       if err != nil {
> +               panic(err.Error())
> +       }
> +
> +       outstr := string(out)
> +       outstr = strings.TrimSuffix(outstr, "\n")
> +       return strings.Replace(outstr, "\n", " ", -1)
> +}
> +
> +func llvmFlags() compilerFlags {
> +       ldflags := llvmConfig(append([]string{"--ldflags", "--libs",
> "--system-libs"}, components...)...)
> +       if runtime.GOOS != "darwin" {
> +               // OS X doesn't like -rpath with cgo. See:
> +               // https://code.google.com/p/go/issues/detail?id=7293
> +               ldflags = "-Wl,-rpath," + llvmConfig("--libdir") + " " +
> ldflags
> +       }
> +       return compilerFlags{
> +               cpp: llvmConfig("--cppflags"),
> +               cxx: "-std=c++11",
> +               ld:  ldflags,
> +       }
> +}
> +
> +func addTag(args []string, tag string) []string {
> +       args = append([]string{}, args...)
> +       addedTag := false
> +       for i, a := range args {
> +               if strings.HasPrefix(a, "-tags=") {
> +                       args[i] = a + " " + tag
> +                       addedTag = true
> +               } else if a == "-tags" && i+1 < len(args) {
> +                       args[i+1] = args[i+1] + " " + tag
> +                       addedTag = true
> +               }
> +       }
> +       if !addedTag {
> +               args = append([]string{args[0], "-tags", tag}, args[1:]...)
> +       }
> +       return args
> +}
> +
> +func printComponents() {
> +       fmt.Println(strings.Join(components, " "))
> +}
> +
> +func printConfig() {
> +       flags := llvmFlags()
> +
> +       fmt.Printf(`// +build !byollvm
> +
> +// This file is generated by llvm-go, do not edit.
> +
> +package llvm
> +
> +/*
> +#cgo CPPFLAGS: %s
> +#cgo CXXFLAGS: %s
> +#cgo LDFLAGS: %s
> +*/
> +import "C"
> +
> +type (run_build_sh int)
> +`, flags.cpp, flags.cxx, flags.ld)
> +}
> +
> +func runGoWithLLVMEnv(args []string, cc, cxx, cppflags, cxxflags, ldflags
> string) {
> +       args = addTag(args, "byollvm")
> +
> +       srcdir := llvmConfig("--src-root")
> +
> +       tmpgopath, err := ioutil.TempDir("", "gopath")
> +       if err != nil {
> +               panic(err.Error())
> +       }
> +
> +       for _, p := range packages {
> +               path := filepath.Join(tmpgopath, "src", p.pkgpath)
> +               err := os.MkdirAll(filepath.Dir(path), os.ModePerm)
> +               if err != nil {
> +                       panic(err.Error())
> +               }
> +
> +               err = os.Symlink(filepath.Join(srcdir, p.llvmpath), path)
> +               if err != nil {
> +                       panic(err.Error())
> +               }
> +       }
> +
> +       newgopathlist := []string{tmpgopath}
> +       newgopathlist = append(newgopathlist,
> filepath.SplitList(os.Getenv("GOPATH"))...)
> +       newgopath := strings.Join(newgopathlist,
> string(filepath.ListSeparator))
> +
> +       flags := llvmFlags()
> +
> +       newenv := []string{
> +               "CC=" + cc,
> +               "CXX=" + cxx,
> +               "CGO_CPPFLAGS=" + flags.cpp + " " + cppflags,
> +               "CGO_CXXFLAGS=" + flags.cxx + " " + cxxflags,
> +               "CGO_LDFLAGS=" + flags.ld + " " + ldflags,
> +               "GOPATH=" + newgopath,
> +       }
> +       for _, v := range os.Environ() {
> +               if !strings.HasPrefix(v, "CC=") &&
> +                       !strings.HasPrefix(v, "CXX=") &&
> +                       !strings.HasPrefix(v, "CGO_CPPFLAGS=") &&
> +                       !strings.HasPrefix(v, "CGO_CXXFLAGS=") &&
> +                       !strings.HasPrefix(v, "CGO_LDFLAGS=") &&
> +                       !strings.HasPrefix(v, "GOPATH=") {
> +                       newenv = append(newenv, v)
> +               }
> +       }
> +
> +       gocmdpath, err := exec.LookPath("go")
> +       if err != nil {
> +               panic(err.Error())
> +       }
> +
> +       proc, err := os.StartProcess(gocmdpath, append([]string{"go"},
> args...),
> +               &os.ProcAttr{
> +                       Env:   newenv,
> +                       Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
> +               })
> +       if err != nil {
> +               panic(err.Error())
> +       }
> +       ps, err := proc.Wait()
> +       if err != nil {
> +               panic(err.Error())
> +       }
> +
> +       os.RemoveAll(tmpgopath)
> +
> +       if !ps.Success() {
> +               os.Exit(1)
> +       }
> +}
> +
> +func usage() {
> +       fmt.Println(`Usage: llvm-go subcommand [flags]
> +
> +Available subcommands: build get install run test print-components
> print-config`)
> +       os.Exit(0)
> +}
> +
> +func main() {
> +       cc := os.Getenv("CC")
> +       cxx := os.Getenv("CXX")
> +       cppflags := os.Getenv("CGO_CPPFLAGS")
> +       cxxflags := os.Getenv("CGO_CXXFLAGS")
> +       ldflags := os.Getenv("CGO_LDFLAGS")
> +
> +       args := os.Args[1:]
> +       DONE: for {
> +               switch {
> +               case len(args) == 0:
> +                       usage()
> +               case strings.HasPrefix(args[0], "cc="):
> +                       cc = args[0][3:]
> +                       args = args[1:]
> +               case strings.HasPrefix(args[0], "cxx="):
> +                       cxx = args[0][4:]
> +                       args = args[1:]
> +               case strings.HasPrefix(args[0], "cppflags="):
> +                       cppflags = args[0][9:]
> +                       args = args[1:]
> +               case strings.HasPrefix(args[0], "cxxflags="):
> +                       cxxflags = args[0][9:]
> +                       args = args[1:]
> +               case strings.HasPrefix(args[0], "ldflags="):
> +                       ldflags = args[0][8:]
> +                       args = args[1:]
> +               default:
> +                       break DONE
> +               }
> +       }
> +
> +       switch args[0] {
> +       case "build", "get", "install", "run", "test":
> +               runGoWithLLVMEnv(args, cc, cxx, cppflags, cxxflags,
> ldflags)
> +       case "print-components":
> +               printComponents()
> +       case "print-config":
> +               printConfig()
> +       default:
> +               usage()
> +       }
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141125/dd361edd/attachment.html>


More information about the llvm-commits mailing list