llvm-3.7.0-link-tools-against-libLLVM.patch 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. diff --git a/CMakeLists.txt b/CMakeLists.txt
  2. index ac3b978..dd50236 100644
  3. --- a/CMakeLists.txt
  4. +++ b/CMakeLists.txt
  5. @@ -342,9 +342,21 @@ option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
  6. option (LLVM_BUILD_EXTERNAL_COMPILER_RT
  7. "Build compiler-rt as an external project." OFF)
  8. -option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" OFF)
  9. -option(LLVM_DYLIB_EXPORT_ALL "Export all symbols from libLLVM.dylib (default is C API only" OFF)
  10. -option(LLVM_DISABLE_LLVM_DYLIB_ATEXIT "Disable llvm-shlib's atexit destructors." ON)
  11. +# You can configure which libraries from LLVM you want to include in the
  12. +# shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited
  13. +# list of LLVM components. All component names handled by llvm-config are valid.
  14. +if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
  15. + set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING
  16. + "Semicolon-separated list of components to include in libLLVM, or \"all\".")
  17. +endif()
  18. +option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
  19. +option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_LINK_LLVM_DYLIB})
  20. +option(LLVM_DYLIB_EXPORT_ALL "Export all symbols from libLLVM.dylib (default is C API only" ${LLVM_LINK_LLVM_DYLIB})
  21. +set(LLVM_DISABLE_LLVM_DYLIB_ATEXIT_DEFAULT ON)
  22. +if (LLVM_LINK_LLVM_DYLIB)
  23. + set(LLVM_DISABLE_LLVM_DYLIB_ATEXIT_DEFAULT OFF)
  24. +endif()
  25. +option(LLVM_DISABLE_LLVM_DYLIB_ATEXIT "Disable llvm-shlib's atexit destructors." ${LLVM_DISABLE_LLVM_DYLIB_ATEXIT_DEFAULT})
  26. if(LLVM_DISABLE_LLVM_DYLIB_ATEXIT)
  27. set(DISABLE_LLVM_DYLIB_ATEXIT 1)
  28. endif()
  29. diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake
  30. index 45f6746..6b6e6e0 100644
  31. --- a/cmake/modules/AddLLVM.cmake
  32. +++ b/cmake/modules/AddLLVM.cmake
  33. @@ -41,7 +41,7 @@ function(llvm_update_compile_flags name)
  34. # Assume that;
  35. # - LLVM_COMPILE_FLAGS is list.
  36. # - PROPERTY COMPILE_FLAGS is string.
  37. - string(REPLACE ";" " " target_compile_flags "${LLVM_COMPILE_FLAGS}")
  38. + string(REPLACE ";" " " target_compile_flags " ${LLVM_COMPILE_FLAGS}")
  39. if(update_src_props)
  40. foreach(fn ${sources})
  41. @@ -303,6 +303,9 @@ endfunction(set_windows_version_resource_properties)
  42. # MODULE
  43. # Target ${name} might not be created on unsupported platforms.
  44. # Check with "if(TARGET ${name})".
  45. +# DISABLE_LLVM_LINK_LLVM_DYLIB
  46. +# Do not link this library to libLLVM, even if
  47. +# LLVM_LINK_LLVM_DYLIB is enabled.
  48. # OUTPUT_NAME name
  49. # Corresponds to OUTPUT_NAME in target properties.
  50. # DEPENDS targets...
  51. @@ -316,7 +319,7 @@ endfunction(set_windows_version_resource_properties)
  52. # )
  53. function(llvm_add_library name)
  54. cmake_parse_arguments(ARG
  55. - "MODULE;SHARED;STATIC"
  56. + "MODULE;SHARED;STATIC;DISABLE_LLVM_LINK_LLVM_DYLIB"
  57. "OUTPUT_NAME"
  58. "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
  59. ${ARGN})
  60. @@ -444,10 +447,14 @@ function(llvm_add_library name)
  61. # property has been set to an empty value.
  62. get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name})
  63. - llvm_map_components_to_libnames(llvm_libs
  64. - ${ARG_LINK_COMPONENTS}
  65. - ${LLVM_LINK_COMPONENTS}
  66. - )
  67. + if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_STATIC AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
  68. + set(llvm_libs LLVM)
  69. + else()
  70. + llvm_map_components_to_libnames(llvm_libs
  71. + ${ARG_LINK_COMPONENTS}
  72. + ${LLVM_LINK_COMPONENTS}
  73. + )
  74. + endif()
  75. if(CMAKE_VERSION VERSION_LESS 2.8.12)
  76. # Link libs w/o keywords, assuming PUBLIC.
  77. @@ -562,7 +569,22 @@ endmacro(add_llvm_loadable_module name)
  78. macro(add_llvm_executable name)
  79. - llvm_process_sources( ALL_FILES ${ARGN} )
  80. + cmake_parse_arguments(ARG "DISABLE_LLVM_LINK_LLVM_DYLIB" "" "" ${ARGN})
  81. + llvm_process_sources( ALL_FILES ${ARG_UNPARSED_ARGUMENTS} )
  82. +
  83. + # Generate objlib
  84. + if(LLVM_ENABLE_OBJLIB)
  85. + # Generate an obj library for both targets.
  86. + set(obj_name "obj.${name}")
  87. + add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL
  88. + ${ALL_FILES}
  89. + )
  90. + llvm_update_compile_flags(${obj_name})
  91. + set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>")
  92. +
  93. + set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries")
  94. + endif()
  95. +
  96. add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
  97. if( EXCLUDE_FROM_ALL )
  98. @@ -588,9 +610,13 @@ macro(add_llvm_executable name)
  99. add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
  100. endif(LLVM_EXPORTED_SYMBOL_FILE)
  101. + if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
  102. + set(USE_SHARED USE_SHARED)
  103. + endif()
  104. +
  105. set(EXCLUDE_FROM_ALL OFF)
  106. set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR})
  107. - llvm_config( ${name} ${LLVM_LINK_COMPONENTS} )
  108. + llvm_config( ${name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} )
  109. if( LLVM_COMMON_DEPENDS )
  110. add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
  111. endif( LLVM_COMMON_DEPENDS )
  112. @@ -651,7 +677,7 @@ endmacro(add_llvm_example name)
  113. macro(add_llvm_utility name)
  114. - add_llvm_executable(${name} ${ARGN})
  115. + add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN})
  116. set_target_properties(${name} PROPERTIES FOLDER "Utils")
  117. if( LLVM_INSTALL_UTILS )
  118. install (TARGETS ${name}
  119. @@ -785,8 +811,13 @@ function(llvm_add_go_executable binary pkgpath)
  120. set(cppflags "${cppflags} -I${d}")
  121. endforeach(d)
  122. set(ldflags "${CMAKE_EXE_LINKER_FLAGS}")
  123. + if (LLVM_LINK_LLVM_DYLIB)
  124. + set(linkmode "dylib")
  125. + else()
  126. + set(linkmode "component-libs")
  127. + endif()
  128. add_custom_command(OUTPUT ${binpath}
  129. - COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}"
  130. + COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "go=${GO_EXECUTABLE}" "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}" "linkmode=${linkmode}"
  131. ${ARG_GOFLAGS} build -o ${binpath} ${pkgpath}
  132. DEPENDS llvm-config ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX}
  133. ${llvmlibs} ${ARG_DEPENDS}
  134. diff --git a/cmake/modules/LLVM-Config.cmake b/cmake/modules/LLVM-Config.cmake
  135. index 22ac714..aa68b40 100644
  136. --- a/cmake/modules/LLVM-Config.cmake
  137. +++ b/cmake/modules/LLVM-Config.cmake
  138. @@ -31,7 +31,23 @@ endfunction(is_llvm_target_library)
  139. macro(llvm_config executable)
  140. - explicit_llvm_config(${executable} ${ARGN})
  141. + cmake_parse_arguments(ARG "USE_SHARED" "" "" ${ARGN})
  142. + set(link_components ${ARG_UNPARSED_ARGUMENTS})
  143. +
  144. + if(USE_SHARED)
  145. + # If USE_SHARED is specified, then we link against libLLVM,
  146. + # but also against the component libraries below. This is
  147. + # done in case libLLVM does not contain all of the components
  148. + # the target requires.
  149. + #
  150. + # TODO strip LLVM_DYLIB_COMPONENTS out of link_components.
  151. + # To do this, we need special handling for "all", since that
  152. + # may imply linking to libraries that are not included in
  153. + # libLLVM.
  154. + target_link_libraries(${executable} LLVM)
  155. + endif()
  156. +
  157. + explicit_llvm_config(${executable} ${link_components})
  158. endmacro(llvm_config)
  159. diff --git a/cmake/modules/TableGen.cmake b/cmake/modules/TableGen.cmake
  160. index 85d720e..fcb445a 100644
  161. --- a/cmake/modules/TableGen.cmake
  162. +++ b/cmake/modules/TableGen.cmake
  163. @@ -73,6 +73,10 @@ endfunction()
  164. macro(add_tablegen target project)
  165. set(${target}_OLD_LLVM_LINK_COMPONENTS ${LLVM_LINK_COMPONENTS})
  166. set(LLVM_LINK_COMPONENTS ${LLVM_LINK_COMPONENTS} TableGen)
  167. +
  168. + # FIXME: It leaks to user, callee of add_tablegen.
  169. + set(LLVM_ENABLE_OBJLIB ON)
  170. +
  171. add_llvm_utility(${target} ${ARGN})
  172. set(LLVM_LINK_COMPONENTS ${${target}_OLD_LLVM_LINK_COMPONENTS})
  173. diff --git a/tools/llvm-go/llvm-go.go b/tools/llvm-go/llvm-go.go
  174. index c5c3fd2..ed79ca6 100644
  175. --- a/tools/llvm-go/llvm-go.go
  176. +++ b/tools/llvm-go/llvm-go.go
  177. @@ -24,6 +24,11 @@ import (
  178. "strings"
  179. )
  180. +const (
  181. + linkmodeComponentLibs = "component-libs"
  182. + linkmodeDylib = "dylib"
  183. +)
  184. +
  185. type pkg struct {
  186. llvmpath, pkgpath string
  187. }
  188. @@ -66,11 +71,12 @@ var components = []string{
  189. func llvmConfig(args ...string) string {
  190. configpath := os.Getenv("LLVM_CONFIG")
  191. if configpath == "" {
  192. - // strip llvm-go, add llvm-config
  193. - configpath = os.Args[0][:len(os.Args[0])-7] + "llvm-config"
  194. + bin, _ := filepath.Split(os.Args[0])
  195. + configpath = filepath.Join(bin, "llvm-config")
  196. }
  197. cmd := exec.Command(configpath, args...)
  198. + cmd.Stderr = os.Stderr
  199. out, err := cmd.Output()
  200. if err != nil {
  201. panic(err.Error())
  202. @@ -78,11 +84,21 @@ func llvmConfig(args ...string) string {
  203. outstr := string(out)
  204. outstr = strings.TrimSuffix(outstr, "\n")
  205. - return strings.Replace(outstr, "\n", " ", -1)
  206. + outstr = strings.Replace(outstr, "\n", " ", -1)
  207. + return outstr
  208. }
  209. -func llvmFlags() compilerFlags {
  210. - ldflags := llvmConfig(append([]string{"--ldflags", "--libs", "--system-libs"}, components...)...)
  211. +func llvmFlags(linkmode string) compilerFlags {
  212. + ldflags := llvmConfig("--ldflags")
  213. + switch linkmode {
  214. + case linkmodeComponentLibs:
  215. + ldflags += " " + llvmConfig(append([]string{"--libs"}, components...)...)
  216. + case linkmodeDylib:
  217. + ldflags += " -lLLVM"
  218. + default:
  219. + panic("invalid linkmode: " + linkmode)
  220. + }
  221. + ldflags += " " + llvmConfig("--system-libs")
  222. if runtime.GOOS != "darwin" {
  223. // OS X doesn't like -rpath with cgo. See:
  224. // https://code.google.com/p/go/issues/detail?id=7293
  225. @@ -117,8 +133,8 @@ func printComponents() {
  226. fmt.Println(strings.Join(components, " "))
  227. }
  228. -func printConfig() {
  229. - flags := llvmFlags()
  230. +func printConfig(linkmode string) {
  231. + flags := llvmFlags(linkmode)
  232. fmt.Printf(`// +build !byollvm
  233. @@ -137,7 +153,7 @@ type (run_build_sh int)
  234. `, flags.cpp, flags.cxx, flags.ld)
  235. }
  236. -func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags string) {
  237. +func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags, linkmode string) {
  238. args = addTag(args, "byollvm")
  239. srcdir := llvmConfig("--src-root")
  240. @@ -166,7 +182,7 @@ func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, l
  241. newgopathlist = append(newgopathlist, filepath.SplitList(os.Getenv("GOPATH"))...)
  242. newgopath := strings.Join(newgopathlist, string(filepath.ListSeparator))
  243. - flags := llvmFlags()
  244. + flags := llvmFlags(linkmode)
  245. newenv := []string{
  246. "CC=" + cc,
  247. @@ -178,7 +194,7 @@ func runGoWithLLVMEnv(args []string, cc, cxx, gocmd, llgo, cppflags, cxxflags, l
  248. "PATH=" + newpath,
  249. }
  250. if llgo != "" {
  251. - newenv = append(newenv, "GCCGO=" + llgo)
  252. + newenv = append(newenv, "GCCGO="+llgo)
  253. }
  254. for _, v := range os.Environ() {
  255. @@ -234,45 +250,44 @@ func main() {
  256. ldflags := os.Getenv("CGO_LDFLAGS")
  257. gocmd := "go"
  258. llgo := ""
  259. + linkmode := linkmodeComponentLibs
  260. +
  261. + flags := []struct {
  262. + name string
  263. + dest *string
  264. + }{
  265. + {"cc", &cc},
  266. + {"cxx", &cxx},
  267. + {"go", &gocmd},
  268. + {"llgo", &llgo},
  269. + {"cppflags", &cppflags},
  270. + {"ldflags", &ldflags},
  271. + {"linkmode", &linkmode},
  272. + }
  273. args := os.Args[1:]
  274. - DONE: for {
  275. - switch {
  276. - case len(args) == 0:
  277. +LOOP:
  278. + for {
  279. + if len(args) == 0 {
  280. usage()
  281. - case strings.HasPrefix(args[0], "cc="):
  282. - cc = args[0][3:]
  283. - args = args[1:]
  284. - case strings.HasPrefix(args[0], "cxx="):
  285. - cxx = args[0][4:]
  286. - args = args[1:]
  287. - case strings.HasPrefix(args[0], "go="):
  288. - gocmd = args[0][3:]
  289. - args = args[1:]
  290. - case strings.HasPrefix(args[0], "llgo="):
  291. - llgo = args[0][5:]
  292. - args = args[1:]
  293. - case strings.HasPrefix(args[0], "cppflags="):
  294. - cppflags = args[0][9:]
  295. - args = args[1:]
  296. - case strings.HasPrefix(args[0], "cxxflags="):
  297. - cxxflags = args[0][9:]
  298. - args = args[1:]
  299. - case strings.HasPrefix(args[0], "ldflags="):
  300. - ldflags = args[0][8:]
  301. - args = args[1:]
  302. - default:
  303. - break DONE
  304. }
  305. + for _, flag := range flags {
  306. + if strings.HasPrefix(args[0], flag.name+"=") {
  307. + *flag.dest = args[0][len(flag.name)+1:]
  308. + args = args[1:]
  309. + continue LOOP
  310. + }
  311. + }
  312. + break
  313. }
  314. switch args[0] {
  315. case "build", "get", "install", "run", "test":
  316. - runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags)
  317. + runGoWithLLVMEnv(args, cc, cxx, gocmd, llgo, cppflags, cxxflags, ldflags, linkmode)
  318. case "print-components":
  319. printComponents()
  320. case "print-config":
  321. - printConfig()
  322. + printConfig(linkmode)
  323. default:
  324. usage()
  325. }
  326. diff --git a/tools/llvm-shlib/CMakeLists.txt b/tools/llvm-shlib/CMakeLists.txt
  327. index 54d71d3..d9bd15f 100644
  328. --- a/tools/llvm-shlib/CMakeLists.txt
  329. +++ b/tools/llvm-shlib/CMakeLists.txt
  330. @@ -2,42 +2,6 @@
  331. # library is enabled by setting LLVM_BUILD_LLVM_DYLIB=yes on the CMake
  332. # commandline. By default the shared library only exports the LLVM C API.
  333. -
  334. -# You can configure which libraries from LLVM you want to include in the shared
  335. -# library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited list of
  336. -# LLVM components. All compoenent names handled by llvm-config are valid.
  337. -
  338. -if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
  339. - set(LLVM_DYLIB_COMPONENTS
  340. - ${LLVM_TARGETS_TO_BUILD}
  341. - Analysis
  342. - BitReader
  343. - BitWriter
  344. - CodeGen
  345. - Core
  346. - DebugInfoDWARF
  347. - DebugInfoPDB
  348. - ExecutionEngine
  349. - IPA
  350. - IPO
  351. - IRReader
  352. - InstCombine
  353. - Instrumentation
  354. - Interpreter
  355. - Linker
  356. - MCDisassembler
  357. - MCJIT
  358. - ObjCARCOpts
  359. - Object
  360. - ScalarOpts
  361. - Support
  362. - Target
  363. - TransformUtils
  364. - Vectorize
  365. - native
  366. - )
  367. -endif()
  368. -
  369. add_definitions( -DLLVM_VERSION_INFO=\"${PACKAGE_VERSION}\" )
  370. set(SOURCES
  371. @@ -46,6 +10,29 @@ set(SOURCES
  372. llvm_map_components_to_libnames(LIB_NAMES ${LLVM_DYLIB_COMPONENTS})
  373. +if(LLVM_LINK_LLVM_DYLIB)
  374. + if(NOT LLVM_DYLIB_EXPORT_ALL)
  375. + message(FATAL_ERROR "LLVM_DYLIB_EXPORT_ALL must be ON when LLVM_LINK_LLVM_DYLIB is ON")
  376. + endif()
  377. +
  378. + # libLLVM.so should not have any dependencies on any other LLVM
  379. + # shared libraries. When using the "all" pseudo-component,
  380. + # LLVM_AVAILABLE_LIBS is added to the dependencies, which may
  381. + # contain shared libraries (e.g. libLTO).
  382. + #
  383. + # Also exclude libLLVMTableGen for the following reasons:
  384. + # - it is only used by internal *-tblgen utilities;
  385. + # - it pollutes the global options space.
  386. + foreach(lib ${LIB_NAMES})
  387. + get_target_property(t ${lib} TYPE)
  388. + if("${lib}" STREQUAL "LLVMTableGen")
  389. + elseif("x${t}" STREQUAL "xSTATIC_LIBRARY")
  390. + list(APPEND FILTERED_LIB_NAMES ${lib})
  391. + endif()
  392. + endforeach()
  393. + set(LIB_NAMES ${FILTERED_LIB_NAMES})
  394. +endif()
  395. +
  396. if(NOT DEFINED LLVM_DYLIB_EXPORTED_SYMBOL_FILE)
  397. if( WIN32 AND NOT CYGWIN )
  398. @@ -95,7 +82,7 @@ else()
  399. add_custom_target(libLLVMExports DEPENDS ${LLVM_EXPORTED_SYMBOL_FILE})
  400. endif()
  401. -add_llvm_library(LLVM SHARED ${SOURCES})
  402. +add_llvm_library(LLVM SHARED DISABLE_LLVM_LINK_LLVM_DYLIB ${SOURCES})
  403. list(REMOVE_DUPLICATES LIB_NAMES)
  404. if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") # FIXME: It should be "GNU ld for elf"