Gentoo Archives: gentoo-commits

From: "Michał Górny" <mgorny@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] repo/gentoo:master commit in: sys-devel/llvm/files/7.0.0/, sys-devel/llvm/
Date: Tue, 02 Oct 2018 18:41:09
Message-Id: 1538505655.cf5cbc3700bc996519f9c5273973f58e6ec3d580.mgorny@gentoo
1 commit: cf5cbc3700bc996519f9c5273973f58e6ec3d580
2 Author: Michał Górny <mgorny <AT> gentoo <DOT> org>
3 AuthorDate: Tue Oct 2 17:56:57 2018 +0000
4 Commit: Michał Górny <mgorny <AT> gentoo <DOT> org>
5 CommitDate: Tue Oct 2 18:40:55 2018 +0000
6 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=cf5cbc37
7
8 sys-devel/llvm: Backport X86 codegen bugfix for Chromium builds
9
10 Backport the X86 codegen fix to 7.0.0 and 6.0.1, to ~arch. Hopefully
11 people will get this along with libffi-enforced rebuild. We can
12 stabilize 6.0.1-r2 either when stable users start hitting this, or when
13 libffi gets stable.
14
15 Bug: https://bugs.gentoo.org/664868
16 Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>
17
18 ...6DomainReassignment-from-creating-copies-.patch | 110 +++++++++
19 sys-devel/llvm/llvm-6.0.1-r2.ebuild | 270 +++++++++++++++++++++
20 sys-devel/llvm/llvm-7.0.0-r1.ebuild | 264 ++++++++++++++++++++
21 3 files changed, 644 insertions(+)
22
23 diff --git a/sys-devel/llvm/files/7.0.0/0001-X86-Stop-X86DomainReassignment-from-creating-copies-.patch b/sys-devel/llvm/files/7.0.0/0001-X86-Stop-X86DomainReassignment-from-creating-copies-.patch
24 new file mode 100644
25 index 00000000000..f38907cdd4c
26 --- /dev/null
27 +++ b/sys-devel/llvm/files/7.0.0/0001-X86-Stop-X86DomainReassignment-from-creating-copies-.patch
28 @@ -0,0 +1,110 @@
29 +From 72da952b396f43d2ce6ca20a0f0d75212fea6b28 Mon Sep 17 00:00:00 2001
30 +From: Craig Topper <craig.topper@×××××.com>
31 +Date: Mon, 1 Oct 2018 07:08:41 +0000
32 +Subject: [PATCH] [X86] Stop X86DomainReassignment from creating copies between
33 + GR8/GR16 physical registers and k-registers.
34 +
35 +We can only copy between a k-register and a GR32/GR64 register.
36 +
37 +This patch detects that the copy will be illegal and prevents the domain reassignment from happening for that closure.
38 +
39 +This probably isn't the best fix, and we should probably figure out how to handle this correctly.
40 +
41 +Fixes PR38803.
42 +
43 +git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@343443 91177308-0d34-0410-b5e6-96231b3b80d8
44 +---
45 + lib/Target/X86/X86DomainReassignment.cpp | 21 +++++++++++
46 + test/CodeGen/X86/pr38803.ll | 48 ++++++++++++++++++++++++
47 + 2 files changed, 69 insertions(+)
48 + create mode 100644 test/CodeGen/X86/pr38803.ll
49 +
50 +diff --git a/lib/Target/X86/X86DomainReassignment.cpp b/lib/Target/X86/X86DomainReassignment.cpp
51 +index 5196446b39e..62588e9509d 100644
52 +--- a/lib/Target/X86/X86DomainReassignment.cpp
53 ++++ b/lib/Target/X86/X86DomainReassignment.cpp
54 +@@ -217,6 +217,27 @@ public:
55 + InstrCOPYReplacer(unsigned SrcOpcode, RegDomain DstDomain, unsigned DstOpcode)
56 + : InstrReplacer(SrcOpcode, DstOpcode), DstDomain(DstDomain) {}
57 +
58 ++ bool isLegal(const MachineInstr *MI,
59 ++ const TargetInstrInfo *TII) const override {
60 ++ if (!InstrConverterBase::isLegal(MI, TII))
61 ++ return false;
62 ++
63 ++ // Don't allow copies to/flow GR8/GR16 physical registers.
64 ++ // FIXME: Is there some better way to support this?
65 ++ unsigned DstReg = MI->getOperand(0).getReg();
66 ++ if (TargetRegisterInfo::isPhysicalRegister(DstReg) &&
67 ++ (X86::GR8RegClass.contains(DstReg) ||
68 ++ X86::GR16RegClass.contains(DstReg)))
69 ++ return false;
70 ++ unsigned SrcReg = MI->getOperand(1).getReg();
71 ++ if (TargetRegisterInfo::isPhysicalRegister(SrcReg) &&
72 ++ (X86::GR8RegClass.contains(SrcReg) ||
73 ++ X86::GR16RegClass.contains(SrcReg)))
74 ++ return false;
75 ++
76 ++ return true;
77 ++ }
78 ++
79 + double getExtraCost(const MachineInstr *MI,
80 + MachineRegisterInfo *MRI) const override {
81 + assert(MI->getOpcode() == TargetOpcode::COPY && "Expected a COPY");
82 +diff --git a/test/CodeGen/X86/pr38803.ll b/test/CodeGen/X86/pr38803.ll
83 +new file mode 100644
84 +index 00000000000..a1ca27d89b0
85 +--- /dev/null
86 ++++ b/test/CodeGen/X86/pr38803.ll
87 +@@ -0,0 +1,48 @@
88 ++; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
89 ++; RUN: llc < %s -mcpu=skylake-avx512 -mtriple=x86_64-unknown-unknown | FileCheck %s
90 ++
91 ++@b = local_unnamed_addr global i32 0, align 4
92 ++@c = local_unnamed_addr global i32 0, align 4
93 ++@d = local_unnamed_addr global float 0.000000e+00, align 4
94 ++
95 ++define float @_Z3fn2v() {
96 ++; CHECK-LABEL: _Z3fn2v:
97 ++; CHECK: # %bb.0: # %entry
98 ++; CHECK-NEXT: pushq %rax
99 ++; CHECK-NEXT: .cfi_def_cfa_offset 16
100 ++; CHECK-NEXT: callq _Z1av
101 ++; CHECK-NEXT: # kill: def $al killed $al def $eax
102 ++; CHECK-NEXT: kmovd %eax, %k1
103 ++; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
104 ++; CHECK-NEXT: vmovss %xmm0, %xmm0, %xmm0 {%k1} {z}
105 ++; CHECK-NEXT: cmpl $0, {{.*}}(%rip)
106 ++; CHECK-NEXT: je .LBB0_2
107 ++; CHECK-NEXT: # %bb.1: # %if.then
108 ++; CHECK-NEXT: vcvtsi2ssl {{.*}}(%rip), %xmm1, %xmm1
109 ++; CHECK-NEXT: kmovd %eax, %k1
110 ++; CHECK-NEXT: vxorps %xmm2, %xmm2, %xmm2
111 ++; CHECK-NEXT: vmovss %xmm2, %xmm0, %xmm1 {%k1}
112 ++; CHECK-NEXT: vmovss %xmm1, {{.*}}(%rip)
113 ++; CHECK-NEXT: .LBB0_2: # %if.end
114 ++; CHECK-NEXT: popq %rax
115 ++; CHECK-NEXT: .cfi_def_cfa_offset 8
116 ++; CHECK-NEXT: retq
117 ++entry:
118 ++ %call = tail call zeroext i1 @_Z1av()
119 ++ %cond = select i1 %call, float 7.500000e-01, float 0.000000e+00
120 ++ %0 = load i32, i32* @c, align 4
121 ++ %tobool2 = icmp eq i32 %0, 0
122 ++ br i1 %tobool2, label %if.end, label %if.then
123 ++
124 ++if.then: ; preds = %entry
125 ++ %1 = load i32, i32* @b, align 4
126 ++ %2 = sitofp i32 %1 to float
127 ++ %conv5 = select i1 %call, float 0.000000e+00, float %2
128 ++ store float %conv5, float* @d, align 4
129 ++ br label %if.end
130 ++
131 ++if.end: ; preds = %entry, %if.then
132 ++ ret float %cond
133 ++}
134 ++
135 ++declare zeroext i1 @_Z1av()
136 +--
137 +2.19.0
138 +
139
140 diff --git a/sys-devel/llvm/llvm-6.0.1-r2.ebuild b/sys-devel/llvm/llvm-6.0.1-r2.ebuild
141 new file mode 100644
142 index 00000000000..d2078979150
143 --- /dev/null
144 +++ b/sys-devel/llvm/llvm-6.0.1-r2.ebuild
145 @@ -0,0 +1,270 @@
146 +# Copyright 1999-2018 Gentoo Foundation
147 +# Distributed under the terms of the GNU General Public License v2
148 +
149 +EAPI=6
150 +
151 +: ${CMAKE_MAKEFILE_GENERATOR:=ninja}
152 +# (needed due to CMAKE_BUILD_TYPE != Gentoo)
153 +CMAKE_MIN_VERSION=3.7.0-r1
154 +PYTHON_COMPAT=( python2_7 )
155 +
156 +inherit cmake-utils eapi7-ver flag-o-matic multilib-minimal \
157 + multiprocessing pax-utils python-any-r1 toolchain-funcs
158 +
159 +DESCRIPTION="Low Level Virtual Machine"
160 +HOMEPAGE="https://llvm.org/"
161 +SRC_URI="https://releases.llvm.org/${PV/_//}/${P/_/}.src.tar.xz
162 + !doc? ( https://dev.gentoo.org/~mgorny/dist/llvm/${P}-manpages.tar.bz2 )"
163 +
164 +# Keep in sync with CMakeLists.txt
165 +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM BPF Hexagon Lanai Mips MSP430
166 + NVPTX PowerPC Sparc SystemZ X86 XCore )
167 +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" )
168 +
169 +# Additional licenses:
170 +# 1. OpenBSD regex: Henry Spencer's license ('rc' in Gentoo) + BSD.
171 +# 2. ARM backend: LLVM Software Grant by ARM.
172 +# 3. MD5 code: public-domain.
173 +# 4. Tests (not installed):
174 +# a. gtest: BSD.
175 +# b. YAML tests: MIT.
176 +
177 +LICENSE="UoI-NCSA rc BSD public-domain
178 + llvm_targets_ARM? ( LLVM-Grant )"
179 +SLOT="$(ver_cut 1)"
180 +KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~x86 ~amd64-fbsd ~amd64-linux ~ppc-macos ~x64-macos ~x86-macos"
181 +IUSE="debug doc gold libedit +libffi ncurses test xar xml
182 + kernel_Darwin ${ALL_LLVM_TARGETS[*]}"
183 +RESTRICT="!test? ( test )"
184 +
185 +RDEPEND="
186 + sys-libs/zlib:0=
187 + gold? ( >=sys-devel/binutils-2.22:*[cxx] )
188 + libedit? ( dev-libs/libedit:0=[${MULTILIB_USEDEP}] )
189 + libffi? ( >=virtual/libffi-3.0.13-r1:0=[${MULTILIB_USEDEP}] )
190 + ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[${MULTILIB_USEDEP}] )
191 + xar? ( app-arch/xar )
192 + xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] )"
193 +# configparser-3.2 breaks the build (3.3 or none at all are fine)
194 +DEPEND="${RDEPEND}
195 + dev-lang/perl
196 + || ( >=sys-devel/gcc-3.0 >=sys-devel/llvm-3.5
197 + ( >=sys-freebsd/freebsd-lib-9.1-r10 sys-libs/libcxx )
198 + )
199 + kernel_Darwin? (
200 + <sys-libs/libcxx-$(ver_cut 1-3).9999
201 + >=sys-devel/binutils-apple-5.1
202 + )
203 + doc? ( dev-python/sphinx )
204 + gold? ( sys-libs/binutils-libs )
205 + libffi? ( virtual/pkgconfig )
206 + !!<dev-python/configparser-3.3.0.2
207 + ${PYTHON_DEPS}"
208 +# There are no file collisions between these versions but having :0
209 +# installed means llvm-config there will take precedence.
210 +RDEPEND="${RDEPEND}
211 + !sys-devel/llvm:0"
212 +PDEPEND="sys-devel/llvm-common
213 + gold? ( >=sys-devel/llvmgold-${SLOT} )"
214 +
215 +REQUIRED_USE="${PYTHON_REQUIRED_USE}
216 + || ( ${ALL_LLVM_TARGETS[*]} )"
217 +
218 +S=${WORKDIR}/${P/_/}.src
219 +
220 +# least intrusive of all
221 +CMAKE_BUILD_TYPE=RelWithDebInfo
222 +
223 +src_prepare() {
224 + # Fix llvm-config for shared linking and sane flags
225 + # https://bugs.gentoo.org/show_bug.cgi?id=565358
226 + eapply "${FILESDIR}"/9999/0007-llvm-config-Clean-up-exported-values-update-for-shar.patch
227 +
228 + # Fix appending -Wl,-rpath-link on non-Linux (-> FreeBSD).
229 + eapply "${FILESDIR}"/6.0.1/0001-cmake-Append-Wl-rpath-link-conditionally-to-GNULD.patch
230 +
231 + # Fix assembly compatibility with binutils-2.31.1
232 + # https://bugs.gentoo.org/663442
233 + eapply "${FILESDIR}"/6.0.1/0002-llvm-mc-Produce-R_X86_64_PLT32-for-call-jmp-foo.patch
234 +
235 + # Fix x86 codegen bug triggered by Chromium
236 + # https://bugs.gentoo.org/664868
237 + eapply "${FILESDIR}"/7.0.0/0001-X86-Stop-X86DomainReassignment-from-creating-copies-.patch
238 +
239 + # disable use of SDK on OSX, bug #568758
240 + sed -i -e 's/xcrun/false/' utils/lit/lit/util.py || die
241 +
242 + # User patches + QA
243 + cmake-utils_src_prepare
244 +}
245 +
246 +multilib_src_configure() {
247 + local ffi_cflags ffi_ldflags
248 + if use libffi; then
249 + ffi_cflags=$($(tc-getPKG_CONFIG) --cflags-only-I libffi)
250 + ffi_ldflags=$($(tc-getPKG_CONFIG) --libs-only-L libffi)
251 + fi
252 +
253 + local libdir=$(get_libdir)
254 + local mycmakeargs=(
255 + # disable appending VCS revision to the version to improve
256 + # direct cache hit ratio
257 + -DLLVM_APPEND_VC_REV=OFF
258 + -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/${SLOT}"
259 + -DLLVM_LIBDIR_SUFFIX=${libdir#lib}
260 +
261 + -DBUILD_SHARED_LIBS=ON
262 + -DLLVM_TARGETS_TO_BUILD="${LLVM_TARGETS// /;}"
263 + -DLLVM_BUILD_TESTS=$(usex test)
264 +
265 + -DLLVM_ENABLE_FFI=$(usex libffi)
266 + -DLLVM_ENABLE_LIBEDIT=$(usex libedit)
267 + -DLLVM_ENABLE_TERMINFO=$(usex ncurses)
268 + -DLLVM_ENABLE_LIBXML2=$(usex xml)
269 + -DLLVM_ENABLE_ASSERTIONS=$(usex debug)
270 + -DLLVM_ENABLE_EH=ON
271 + -DLLVM_ENABLE_RTTI=ON
272 +
273 + -DWITH_POLLY=OFF # TODO
274 +
275 + -DLLVM_HOST_TRIPLE="${CHOST}"
276 +
277 + -DFFI_INCLUDE_DIR="${ffi_cflags#-I}"
278 + -DFFI_LIBRARY_DIR="${ffi_ldflags#-L}"
279 + # used only for llvm-objdump tool
280 + -DHAVE_LIBXAR=$(multilib_native_usex xar 1 0)
281 +
282 + # disable OCaml bindings (now in dev-ml/llvm-ocaml)
283 + -DOCAMLFIND=NO
284 + )
285 +
286 +# Note: go bindings have no CMake rules at the moment
287 +# but let's kill the check in case they are introduced
288 +# if ! multilib_is_native_abi || ! use go; then
289 + mycmakeargs+=(
290 + -DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND
291 + )
292 +# fi
293 +
294 + use test && mycmakeargs+=(
295 + -DLLVM_LIT_ARGS="-vv;-j;${LIT_JOBS:-$(makeopts_jobs "${MAKEOPTS}" "$(get_nproc)")}"
296 + )
297 +
298 + if multilib_is_native_abi; then
299 + mycmakeargs+=(
300 + -DLLVM_BUILD_DOCS=$(usex doc)
301 + -DLLVM_ENABLE_OCAMLDOC=OFF
302 + -DLLVM_ENABLE_SPHINX=$(usex doc)
303 + -DLLVM_ENABLE_DOXYGEN=OFF
304 + -DLLVM_INSTALL_UTILS=ON
305 + )
306 + use doc && mycmakeargs+=(
307 + -DCMAKE_INSTALL_MANDIR="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man"
308 + -DLLVM_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/html"
309 + -DSPHINX_WARNINGS_AS_ERRORS=OFF
310 + )
311 + use gold && mycmakeargs+=(
312 + -DLLVM_BINUTILS_INCDIR="${EPREFIX}"/usr/include
313 + )
314 + fi
315 +
316 + if tc-is-cross-compiler; then
317 + local tblgen="${EPREFIX}/usr/lib/llvm/${SLOT}/bin/llvm-tblgen"
318 + [[ -x "${tblgen}" ]] \
319 + || die "${tblgen} not found or usable"
320 + mycmakeargs+=(
321 + -DCMAKE_CROSSCOMPILING=ON
322 + -DLLVM_TABLEGEN="${tblgen}"
323 + )
324 + fi
325 +
326 + # workaround BMI bug in gcc-7 (fixed in 7.4)
327 + # https://bugs.gentoo.org/649880
328 + # apply only to x86, https://bugs.gentoo.org/650506
329 + if tc-is-gcc && [[ ${MULTILIB_ABI_FLAG} == abi_x86* ]] &&
330 + [[ $(gcc-major-version) -eq 7 && $(gcc-minor-version) -lt 4 ]]
331 + then
332 + local CFLAGS="${CFLAGS} -mno-bmi"
333 + local CXXFLAGS="${CXXFLAGS} -mno-bmi"
334 + fi
335 +
336 + # LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844
337 + use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG"
338 + cmake-utils_src_configure
339 +}
340 +
341 +multilib_src_compile() {
342 + cmake-utils_src_compile
343 +
344 + pax-mark m "${BUILD_DIR}"/bin/llvm-rtdyld
345 + pax-mark m "${BUILD_DIR}"/bin/lli
346 + pax-mark m "${BUILD_DIR}"/bin/lli-child-target
347 +
348 + if use test; then
349 + pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/Orc/OrcJITTests
350 + pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/MCJIT/MCJITTests
351 + pax-mark m "${BUILD_DIR}"/unittests/Support/SupportTests
352 + fi
353 +}
354 +
355 +multilib_src_test() {
356 + # respect TMPDIR!
357 + local -x LIT_PRESERVES_TMP=1
358 + cmake-utils_src_make check
359 +}
360 +
361 +src_install() {
362 + local MULTILIB_CHOST_TOOLS=(
363 + /usr/lib/llvm/${SLOT}/bin/llvm-config
364 + )
365 +
366 + local MULTILIB_WRAPPED_HEADERS=(
367 + /usr/include/llvm/Config/llvm-config.h
368 + )
369 +
370 + local LLVM_LDPATHS=()
371 + multilib-minimal_src_install
372 +
373 + # move wrapped headers back
374 + mv "${ED%/}"/usr/include "${ED%/}"/usr/lib/llvm/${SLOT}/include || die
375 +}
376 +
377 +multilib_src_install() {
378 + cmake-utils_src_install
379 +
380 + # move headers to /usr/include for wrapping
381 + rm -rf "${ED%/}"/usr/include || die
382 + mv "${ED%/}"/usr/lib/llvm/${SLOT}/include "${ED%/}"/usr/include || die
383 +
384 + LLVM_LDPATHS+=( "${EPREFIX}/usr/lib/llvm/${SLOT}/$(get_libdir)" )
385 +}
386 +
387 +multilib_src_install_all() {
388 + local revord=$(( 9999 - ${SLOT} ))
389 + cat <<-_EOF_ > "${T}/10llvm-${revord}" || die
390 + PATH="${EPREFIX}/usr/lib/llvm/${SLOT}/bin"
391 + # we need to duplicate it in ROOTPATH for Portage to respect...
392 + ROOTPATH="${EPREFIX}/usr/lib/llvm/${SLOT}/bin"
393 + MANPATH="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man"
394 + LDPATH="$( IFS=:; echo "${LLVM_LDPATHS[*]}" )"
395 +_EOF_
396 + doenvd "${T}/10llvm-${revord}"
397 +
398 + # install pre-generated manpages
399 + if ! use doc; then
400 + # (doman does not support custom paths)
401 + insinto "/usr/lib/llvm/${SLOT}/share/man/man1"
402 + doins "${WORKDIR}/${P}-manpages/llvm"/*.1
403 + fi
404 +
405 + docompress "/usr/lib/llvm/${SLOT}/share/man"
406 +}
407 +
408 +pkg_postinst() {
409 + elog "You can find additional opt-viewer utility scripts in:"
410 + elog " ${EROOT}/usr/lib/llvm/${SLOT}/share/opt-viewer"
411 + elog "To use these scripts, you will need Python 2.7 along with the following"
412 + elog "packages:"
413 + elog " dev-python/pygments (for opt-viewer)"
414 + elog " dev-python/pyyaml (for all of them)"
415 +}
416
417 diff --git a/sys-devel/llvm/llvm-7.0.0-r1.ebuild b/sys-devel/llvm/llvm-7.0.0-r1.ebuild
418 new file mode 100644
419 index 00000000000..49fdc4c05a6
420 --- /dev/null
421 +++ b/sys-devel/llvm/llvm-7.0.0-r1.ebuild
422 @@ -0,0 +1,264 @@
423 +# Copyright 1999-2018 Gentoo Foundation
424 +# Distributed under the terms of the GNU General Public License v2
425 +
426 +EAPI=6
427 +
428 +: ${CMAKE_MAKEFILE_GENERATOR:=ninja}
429 +# (needed due to CMAKE_BUILD_TYPE != Gentoo)
430 +CMAKE_MIN_VERSION=3.7.0-r1
431 +PYTHON_COMPAT=( python2_7 )
432 +
433 +inherit cmake-utils eapi7-ver flag-o-matic multilib-minimal \
434 + multiprocessing pax-utils python-any-r1 toolchain-funcs
435 +
436 +DESCRIPTION="Low Level Virtual Machine"
437 +HOMEPAGE="https://llvm.org/"
438 +SRC_URI="https://releases.llvm.org/${PV/_//}/${P/_/}.src.tar.xz
439 + !doc? ( https://dev.gentoo.org/~mgorny/dist/llvm/${P}-manpages.tar.bz2 )"
440 +
441 +# Keep in sync with CMakeLists.txt
442 +ALL_LLVM_TARGETS=( AArch64 AMDGPU ARM BPF Hexagon Lanai Mips MSP430
443 + NVPTX PowerPC Sparc SystemZ X86 XCore )
444 +ALL_LLVM_TARGETS=( "${ALL_LLVM_TARGETS[@]/#/llvm_targets_}" )
445 +
446 +# Additional licenses:
447 +# 1. OpenBSD regex: Henry Spencer's license ('rc' in Gentoo) + BSD.
448 +# 2. ARM backend: LLVM Software Grant by ARM.
449 +# 3. MD5 code: public-domain.
450 +# 4. Tests (not installed):
451 +# a. gtest: BSD.
452 +# b. YAML tests: MIT.
453 +
454 +LICENSE="UoI-NCSA rc BSD public-domain
455 + llvm_targets_ARM? ( LLVM-Grant )"
456 +SLOT="$(ver_cut 1)"
457 +KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~x86 ~amd64-fbsd ~amd64-linux ~ppc-macos ~x64-macos ~x86-macos"
458 +IUSE="debug doc exegesis gold libedit +libffi ncurses test xar xml
459 + kernel_Darwin ${ALL_LLVM_TARGETS[*]}"
460 +RESTRICT="!test? ( test )"
461 +
462 +RDEPEND="
463 + sys-libs/zlib:0=
464 + exegesis? ( dev-libs/libpfm:= )
465 + gold? ( >=sys-devel/binutils-2.22:*[cxx] )
466 + libedit? ( dev-libs/libedit:0=[${MULTILIB_USEDEP}] )
467 + libffi? ( >=virtual/libffi-3.0.13-r1:0=[${MULTILIB_USEDEP}] )
468 + ncurses? ( >=sys-libs/ncurses-5.9-r3:0=[${MULTILIB_USEDEP}] )
469 + xar? ( app-arch/xar )
470 + xml? ( dev-libs/libxml2:2=[${MULTILIB_USEDEP}] )"
471 +# configparser-3.2 breaks the build (3.3 or none at all are fine)
472 +DEPEND="${RDEPEND}
473 + dev-lang/perl
474 + || ( >=sys-devel/gcc-3.0 >=sys-devel/llvm-3.5
475 + ( >=sys-freebsd/freebsd-lib-9.1-r10 sys-libs/libcxx )
476 + )
477 + kernel_Darwin? (
478 + <sys-libs/libcxx-$(ver_cut 1-3).9999
479 + >=sys-devel/binutils-apple-5.1
480 + )
481 + doc? ( dev-python/sphinx )
482 + gold? ( sys-libs/binutils-libs )
483 + libffi? ( virtual/pkgconfig )
484 + !!<dev-python/configparser-3.3.0.2
485 + ${PYTHON_DEPS}"
486 +# There are no file collisions between these versions but having :0
487 +# installed means llvm-config there will take precedence.
488 +RDEPEND="${RDEPEND}
489 + !sys-devel/llvm:0"
490 +PDEPEND="sys-devel/llvm-common
491 + gold? ( >=sys-devel/llvmgold-${SLOT} )"
492 +
493 +REQUIRED_USE="${PYTHON_REQUIRED_USE}
494 + || ( ${ALL_LLVM_TARGETS[*]} )"
495 +
496 +S=${WORKDIR}/${P/_/}.src
497 +
498 +# least intrusive of all
499 +CMAKE_BUILD_TYPE=RelWithDebInfo
500 +
501 +src_prepare() {
502 + # Fix llvm-config for shared linking and sane flags
503 + # https://bugs.gentoo.org/show_bug.cgi?id=565358
504 + eapply "${FILESDIR}"/9999/0007-llvm-config-Clean-up-exported-values-update-for-shar.patch
505 +
506 + # Fix x86 codegen bug triggered by Chromium
507 + # https://bugs.gentoo.org/664868
508 + eapply "${FILESDIR}"/7.0.0/0001-X86-Stop-X86DomainReassignment-from-creating-copies-.patch
509 +
510 + # disable use of SDK on OSX, bug #568758
511 + sed -i -e 's/xcrun/false/' utils/lit/lit/util.py || die
512 +
513 + # User patches + QA
514 + cmake-utils_src_prepare
515 +}
516 +
517 +multilib_src_configure() {
518 + local ffi_cflags ffi_ldflags
519 + if use libffi; then
520 + ffi_cflags=$($(tc-getPKG_CONFIG) --cflags-only-I libffi)
521 + ffi_ldflags=$($(tc-getPKG_CONFIG) --libs-only-L libffi)
522 + fi
523 +
524 + local libdir=$(get_libdir)
525 + local mycmakeargs=(
526 + # disable appending VCS revision to the version to improve
527 + # direct cache hit ratio
528 + -DLLVM_APPEND_VC_REV=OFF
529 + -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/${SLOT}"
530 + -DLLVM_LIBDIR_SUFFIX=${libdir#lib}
531 +
532 + -DBUILD_SHARED_LIBS=ON
533 + -DLLVM_TARGETS_TO_BUILD="${LLVM_TARGETS// /;}"
534 + -DLLVM_BUILD_TESTS=$(usex test)
535 +
536 + -DLLVM_ENABLE_FFI=$(usex libffi)
537 + -DLLVM_ENABLE_LIBEDIT=$(usex libedit)
538 + -DLLVM_ENABLE_TERMINFO=$(usex ncurses)
539 + -DLLVM_ENABLE_LIBXML2=$(usex xml)
540 + -DLLVM_ENABLE_ASSERTIONS=$(usex debug)
541 + -DLLVM_ENABLE_LIBPFM=$(usex exegesis)
542 + -DLLVM_ENABLE_EH=ON
543 + -DLLVM_ENABLE_RTTI=ON
544 +
545 + -DWITH_POLLY=OFF # TODO
546 +
547 + -DLLVM_HOST_TRIPLE="${CHOST}"
548 +
549 + -DFFI_INCLUDE_DIR="${ffi_cflags#-I}"
550 + -DFFI_LIBRARY_DIR="${ffi_ldflags#-L}"
551 + # used only for llvm-objdump tool
552 + -DHAVE_LIBXAR=$(multilib_native_usex xar 1 0)
553 +
554 + # disable OCaml bindings (now in dev-ml/llvm-ocaml)
555 + -DOCAMLFIND=NO
556 + )
557 +
558 +# Note: go bindings have no CMake rules at the moment
559 +# but let's kill the check in case they are introduced
560 +# if ! multilib_is_native_abi || ! use go; then
561 + mycmakeargs+=(
562 + -DGO_EXECUTABLE=GO_EXECUTABLE-NOTFOUND
563 + )
564 +# fi
565 +
566 + use test && mycmakeargs+=(
567 + -DLLVM_LIT_ARGS="-vv;-j;${LIT_JOBS:-$(makeopts_jobs "${MAKEOPTS}" "$(get_nproc)")}"
568 + )
569 +
570 + if multilib_is_native_abi; then
571 + mycmakeargs+=(
572 + -DLLVM_BUILD_DOCS=$(usex doc)
573 + -DLLVM_ENABLE_OCAMLDOC=OFF
574 + -DLLVM_ENABLE_SPHINX=$(usex doc)
575 + -DLLVM_ENABLE_DOXYGEN=OFF
576 + -DLLVM_INSTALL_UTILS=ON
577 + )
578 + use doc && mycmakeargs+=(
579 + -DCMAKE_INSTALL_MANDIR="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man"
580 + -DLLVM_INSTALL_SPHINX_HTML_DIR="${EPREFIX}/usr/share/doc/${PF}/html"
581 + -DSPHINX_WARNINGS_AS_ERRORS=OFF
582 + )
583 + use gold && mycmakeargs+=(
584 + -DLLVM_BINUTILS_INCDIR="${EPREFIX}"/usr/include
585 + )
586 + fi
587 +
588 + if tc-is-cross-compiler; then
589 + local tblgen="${EPREFIX}/usr/lib/llvm/${SLOT}/bin/llvm-tblgen"
590 + [[ -x "${tblgen}" ]] \
591 + || die "${tblgen} not found or usable"
592 + mycmakeargs+=(
593 + -DCMAKE_CROSSCOMPILING=ON
594 + -DLLVM_TABLEGEN="${tblgen}"
595 + )
596 + fi
597 +
598 + # workaround BMI bug in gcc-7 (fixed in 7.4)
599 + # https://bugs.gentoo.org/649880
600 + # apply only to x86, https://bugs.gentoo.org/650506
601 + if tc-is-gcc && [[ ${MULTILIB_ABI_FLAG} == abi_x86* ]] &&
602 + [[ $(gcc-major-version) -eq 7 && $(gcc-minor-version) -lt 4 ]]
603 + then
604 + local CFLAGS="${CFLAGS} -mno-bmi"
605 + local CXXFLAGS="${CXXFLAGS} -mno-bmi"
606 + fi
607 +
608 + # LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844
609 + use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG"
610 + cmake-utils_src_configure
611 +}
612 +
613 +multilib_src_compile() {
614 + cmake-utils_src_compile
615 +
616 + pax-mark m "${BUILD_DIR}"/bin/llvm-rtdyld
617 + pax-mark m "${BUILD_DIR}"/bin/lli
618 + pax-mark m "${BUILD_DIR}"/bin/lli-child-target
619 +
620 + if use test; then
621 + pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/Orc/OrcJITTests
622 + pax-mark m "${BUILD_DIR}"/unittests/ExecutionEngine/MCJIT/MCJITTests
623 + pax-mark m "${BUILD_DIR}"/unittests/Support/SupportTests
624 + fi
625 +}
626 +
627 +multilib_src_test() {
628 + # respect TMPDIR!
629 + local -x LIT_PRESERVES_TMP=1
630 + cmake-utils_src_make check
631 +}
632 +
633 +src_install() {
634 + local MULTILIB_CHOST_TOOLS=(
635 + /usr/lib/llvm/${SLOT}/bin/llvm-config
636 + )
637 +
638 + local MULTILIB_WRAPPED_HEADERS=(
639 + /usr/include/llvm/Config/llvm-config.h
640 + )
641 +
642 + local LLVM_LDPATHS=()
643 + multilib-minimal_src_install
644 +
645 + # move wrapped headers back
646 + mv "${ED%/}"/usr/include "${ED%/}"/usr/lib/llvm/${SLOT}/include || die
647 +}
648 +
649 +multilib_src_install() {
650 + cmake-utils_src_install
651 +
652 + # move headers to /usr/include for wrapping
653 + rm -rf "${ED%/}"/usr/include || die
654 + mv "${ED%/}"/usr/lib/llvm/${SLOT}/include "${ED%/}"/usr/include || die
655 +
656 + LLVM_LDPATHS+=( "${EPREFIX}/usr/lib/llvm/${SLOT}/$(get_libdir)" )
657 +}
658 +
659 +multilib_src_install_all() {
660 + local revord=$(( 9999 - ${SLOT} ))
661 + newenvd - "10llvm-${revord}" <<-_EOF_
662 + PATH="${EPREFIX}/usr/lib/llvm/${SLOT}/bin"
663 + # we need to duplicate it in ROOTPATH for Portage to respect...
664 + ROOTPATH="${EPREFIX}/usr/lib/llvm/${SLOT}/bin"
665 + MANPATH="${EPREFIX}/usr/lib/llvm/${SLOT}/share/man"
666 + LDPATH="$( IFS=:; echo "${LLVM_LDPATHS[*]}" )"
667 + _EOF_
668 +
669 + # install pre-generated manpages
670 + if ! use doc; then
671 + # (doman does not support custom paths)
672 + insinto "/usr/lib/llvm/${SLOT}/share/man/man1"
673 + doins "${WORKDIR}/${P}-manpages/llvm"/*.1
674 + fi
675 +
676 + docompress "/usr/lib/llvm/${SLOT}/share/man"
677 +}
678 +
679 +pkg_postinst() {
680 + elog "You can find additional opt-viewer utility scripts in:"
681 + elog " ${EROOT%/}/usr/lib/llvm/${SLOT}/share/opt-viewer"
682 + elog "To use these scripts, you will need Python 2.7 along with the following"
683 + elog "packages:"
684 + elog " dev-python/pygments (for opt-viewer)"
685 + elog " dev-python/pyyaml (for all of them)"
686 +}