[PATCH] gnu: llvm: fix riscv64 cross-compile.

  • Done
  • quality assurance status badge
Details
3 participants
  • Z572
  • ???
  • Ludovic Courtès
Owner
unassigned
Submitted by
Z572
Severity
normal
Z
(address . guix-patches@gnu.org)
tencent_59877F623A46E5A925ECB59E9B3CA9655908@qq.com
* gnu/packages/llvm.scm: (llvm-15 llvm-14 llvm-12): fix riscv64 cross-compile
[arguments]: <#:configure>: when target is riscv64, set -DLLVM_TARGET_ARCH=RISCV64.
---
gnu/packages/llvm.scm | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)

Toggle diff (47 lines)
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index e5bf9f5cae..f8691414d8 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -26,6 +26,7 @@
;;; Copyright © 2022 John Kehayias <john.kehayias@protonmail.com>
;;; Copyright © 2022 Clément Lassieur <clement@lassieur.org>
;;; Copyright © 2022 Zhu Zihao <all_but_last@163.com>
+;;; Copyright © 2023 Zheng Junjie <873216071@qq.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -598,7 +599,9 @@ (define-public llvm-15
#$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE="
(%current-target-system))
#$(string-append "-DLLVM_TARGET_ARCH="
- (system->llvm-target))
+ (if (target-riscv64?)
+ "RISCV64"
+ (system->llvm-target)))
#$(string-append "-DLLVM_TARGETS_TO_BUILD="
(system->llvm-target)))
'())
@@ -658,7 +661,9 @@ (define-public llvm-14
#$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE="
(%current-target-system))
#$(string-append "-DLLVM_TARGET_ARCH="
- (system->llvm-target))
+ (if (target-riscv64?)
+ "RISCV64"
+ (system->llvm-target)))
#$(string-append "-DLLVM_TARGETS_TO_BUILD="
(system->llvm-target)))
'())
@@ -910,7 +915,9 @@ (define-public llvm-12
#$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE="
(%current-target-system))
#$(string-append "-DLLVM_TARGET_ARCH="
- (system->llvm-target))
+ (if (target-riscv64?)
+ "RISCV64"
+ (system->llvm-target)))
#$(string-append "-DLLVM_TARGETS_TO_BUILD="
(system->llvm-target)))
#~())
--
2.39.2
?
(name . Z572)(address . 873216071@qq.com)(address . 62438@debbugs.gnu.org)
874jpxb4qa.fsf@envs.net
Z572 <873216071@qq.com> writes:


Toggle quote (19 lines)
> - (system->llvm-target))
> + (if (target-riscv64?)
> + "RISCV64"
> + (system->llvm-target)))
> #$(string-append "-DLLVM_TARGETS_TO_BUILD="
> (system->llvm-target)))
> '())
> @@ -658,7 +661,9 @@ (define-public llvm-14
> #$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE="
> (%current-target-system))
> #$(string-append "-DLLVM_TARGET_ARCH="
> - (system->llvm-target))
> + (if (target-riscv64?)
> + "RISCV64"
> + (system->llvm-target)))
> #$(string-append "-DLLVM_TARGETS_TO_BUILD="
> (system->llvm-target)))
> '())

Hello, our `system->llvm-target` has riscv => "RISCV", does it wrong
(should be changed to RISCV64) or does it right only for 32bit RISCV?
And can system->llvm-target be fixed instead of fix each its usage?

Thanks!
Z
(name . ???)(address . iyzsong@envs.net)(address . 62438@debbugs.gnu.org)
tencent_18596F7F183AADE5EA2575B5F19B1AA9F408@qq.com
??? <iyzsong@envs.net> writes:

Toggle quote (31 lines)
> Z572 <873216071@qq.com> writes:
>
>
>> - (system->llvm-target))
>> + (if (target-riscv64?)
>> + "RISCV64"
>> + (system->llvm-target)))
>> #$(string-append "-DLLVM_TARGETS_TO_BUILD="
>> (system->llvm-target)))
>> '())
>> @@ -658,7 +661,9 @@ (define-public llvm-14
>> #$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE="
>> (%current-target-system))
>> #$(string-append "-DLLVM_TARGET_ARCH="
>> - (system->llvm-target))
>> + (if (target-riscv64?)
>> + "RISCV64"
>> + (system->llvm-target)))
>> #$(string-append "-DLLVM_TARGETS_TO_BUILD="
>> (system->llvm-target)))
>> '())
>
> Hello, our `system->llvm-target` has riscv => "RISCV", does it wrong
> (should be changed to RISCV64) or does it right only for 32bit RISCV?
> And can system->llvm-target be fixed instead of fix each its usage?
>
> Thanks!
>
>
>
>
hello, system->llvm-target work for LLVM_TARGETS_TO_BUILD, but not work
for LLVM_TARGET_ARCH.
llvm.scm (system->llvm-target) also have a commit
;; See the 'lib/Target' directory of LLVM for a list of supported targets.


see
LLVM_TARGET_ARCH is work for RISCV64 and RISCV32, not RISCV.

xxx|..........cmake/config-ix.cmake..............
432| elseif (LLVM_NATIVE_ARCH MATCHES "wasm64")
433| set(LLVM_NATIVE_ARCH WebAssembly)
434| elseif (LLVM_NATIVE_ARCH MATCHES "riscv32")
435| set(LLVM_NATIVE_ARCH RISCV)
436| elseif (LLVM_NATIVE_ARCH MATCHES "riscv64")
437| set(LLVM_NATIVE_ARCH RISCV)
xxx|.................other.......................


see
RISCV is work for LLVM_TARGETS_TO_BUILD, it can find /lib/Target/RISCV
directory, if system->llvm_targets return "RISCV64", it cann't
work,because only have RISCV directory.

xxx|...............................cmake/config-ix.cmake.......................
450| list(FIND LLVM_TARGETS_TO_BUILD ${LLVM_NATIVE_ARCH} NATIVE_ARCH_IDX)
451| if (NATIVE_ARCH_IDX EQUAL -1)
452| message(STATUS
453| "Native target ${LLVM_NATIVE_ARCH} is not selected; lli will not JIT code")
454| else ()
455| message(STATUS "Native target architecture is ${LLVM_NATIVE_ARCH}")
456| set(LLVM_NATIVE_TARGET LLVMInitialize${LLVM_NATIVE_ARCH}Target)
457| set(LLVM_NATIVE_TARGETINFO LLVMInitialize${LLVM_NATIVE_ARCH}TargetInfo)
458| set(LLVM_NATIVE_TARGETMC LLVMInitialize${LLVM_NATIVE_ARCH}TargetMC)
459| set(LLVM_NATIVE_ASMPRINTER LLVMInitialize${LLVM_NATIVE_ARCH}AsmPrinter)
460|
461| # We don't have an ASM parser for all architectures yet.
462| if (EXISTS ${PROJECT_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/AsmParser/CMakeLists.txt)
463| set(LLVM_NATIVE_ASMPARSER LLVMInitialize${LLVM_NATIVE_ARCH}AsmParser)
464| endif ()
465|
466| # We don't have an disassembler for all architectures yet.
467| if (EXISTS ${PROJECT_SOURCE_DIR}/lib/Target/${LLVM_NATIVE_ARCH}/Disassembler/CMakeLists.txt)
468| set(LLVM_NATIVE_DISASSEMBLER LLVMInitialize${LLVM_NATIVE_ARCH}Disassembler)
469| endif ()
470| endif ()
xxx|...........................................other...........................

so a other idea is add a new procedure make -DLLVM_TARGETS_TO_BUILD and
-DLLVM_DEFAULT_TARGET_TRIPLE don't use same procedure.

or not set -DLLVM_TARGET_ARCH like nixpkgs
it build success on my computer too.

Thoughts?

--
over
Z
[PATCH] gnu: llvm: Fix riscv64 cross-compilation.
(address . 62438@debbugs.gnu.org)
tencent_8D1DD8728892C6DAF14D8BD4A92CFC3F4607@qq.com
* gnu/packages/llvm.scm (system->llvm-target-arch): New procedure.
(llvm-15,llvm-14,llvm-12): Use It.
---
gnu/packages/llvm.scm | 30 +++++++++++++++++++++++++++---
1 file changed, 27 insertions(+), 3 deletions(-)

Toggle diff (66 lines)
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index e5bf9f5cae..46cbd4d15a 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -101,6 +101,30 @@ (define* (system->llvm-target #:optional
("i686" => "X86")
("i586" => "X86"))))
+(define* (system->llvm-target-arch #:optional
+ (system (or (and=> (%current-target-system)
+ gnu-triplet->nix-system)
+ (%current-system))))
+ "Return the LLVM target arch name that corresponds to SYSTEM, a system type such
+as \"x86_64-linux\"."
+ ;; See the 'cmake/config-ix.cmake' file of LLVM for a list of supported targets arch.
+ ;; start with # Determine the native architecture.
+ (letrec-syntax ((matches (syntax-rules (=>)
+ ((_ (system-prefix => target) rest ...)
+ (if (string-prefix? system-prefix system)
+ target
+ (matches rest ...)))
+ ((_)
+ (error "LLVM target arch for system is unknown" system)))))
+ (matches ("aarch64" => "AArch64")
+ ("armhf" => "ARM")
+ ("mips64el" => "Mips")
+ ("powerpc" => "PowerPC")
+ ("riscv64" => "RISCV64")
+ ("x86_64" => "X86_64")
+ ("i686" => "X86")
+ ("i586" => "X86"))))
+
(define (llvm-uri component version)
;; LLVM release candidate file names are formatted 'tool-A.B.C-rcN/tool-A.B.CrcN.src.tar.xz'
;; so we specify the version as A.B.C-rcN and delete the hyphen when referencing the file name.
@@ -598,7 +622,7 @@ (define-public llvm-15
#$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE="
(%current-target-system))
#$(string-append "-DLLVM_TARGET_ARCH="
- (system->llvm-target))
+ (system->llvm-target-arch))
#$(string-append "-DLLVM_TARGETS_TO_BUILD="
(system->llvm-target)))
'())
@@ -658,7 +682,7 @@ (define-public llvm-14
#$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE="
(%current-target-system))
#$(string-append "-DLLVM_TARGET_ARCH="
- (system->llvm-target))
+ (system->llvm-target-arch))
#$(string-append "-DLLVM_TARGETS_TO_BUILD="
(system->llvm-target)))
'())
@@ -910,7 +934,7 @@ (define-public llvm-12
#$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE="
(%current-target-system))
#$(string-append "-DLLVM_TARGET_ARCH="
- (system->llvm-target))
+ (system->llvm-target-arch))
#$(string-append "-DLLVM_TARGETS_TO_BUILD="
(system->llvm-target)))
#~())

base-commit: 6311493d7a6271bfbc51f4693857f9a12fe9965d
--
2.39.2
L
L
Ludovic Courtès wrote on 9 Jun 2023 23:12
Re: bug#62438: [PATCH] gnu: llvm: fix riscv64 cross-compile.
(name . Z572)(address . 873216071@qq.com)
87legstk5f.fsf_-_@gnu.org
Hi,

Z572 <873216071@qq.com> skribis:

Toggle quote (24 lines)
> +(define* (system->llvm-target-arch #:optional
> + (system (or (and=> (%current-target-system)
> + gnu-triplet->nix-system)
> + (%current-system))))
> + "Return the LLVM target arch name that corresponds to SYSTEM, a system type such
> +as \"x86_64-linux\"."
> + ;; See the 'cmake/config-ix.cmake' file of LLVM for a list of supported targets arch.
> + ;; start with # Determine the native architecture.
> + (letrec-syntax ((matches (syntax-rules (=>)
> + ((_ (system-prefix => target) rest ...)
> + (if (string-prefix? system-prefix system)
> + target
> + (matches rest ...)))
> + ((_)
> + (error "LLVM target arch for system is unknown" system)))))
> + (matches ("aarch64" => "AArch64")
> + ("armhf" => "ARM")
> + ("mips64el" => "Mips")
> + ("powerpc" => "PowerPC")
> + ("riscv64" => "RISCV64")
> + ("x86_64" => "X86_64")
> + ("i686" => "X86")
> + ("i586" => "X86"))))

The only different compared to ‘system->llvm-target’ is “riscv64”
instead of “riscv”. Why not add that line to ‘system->llvm-target’
instead of duplicating it?

Thanks,
Ludo’.
Z
Re: [bug#62438] [PATCH] gnu: llvm: fix riscv64 cross-compile.
(name . Ludovic Courtès)(address . ludo@gnu.org)
tencent_812531B51E9BDEA97C59387FEE3AF2E55108@qq.com
Ludovic Courtès <ludo@gnu.org> writes:

Toggle quote (33 lines)
> Hi,
>
> Z572 <873216071@qq.com> skribis:
>
>> +(define* (system->llvm-target-arch #:optional
>> + (system (or (and=> (%current-target-system)
>> + gnu-triplet->nix-system)
>> + (%current-system))))
>> + "Return the LLVM target arch name that corresponds to SYSTEM, a system type such
>> +as \"x86_64-linux\"."
>> + ;; See the 'cmake/config-ix.cmake' file of LLVM for a list of supported targets arch.
>> + ;; start with # Determine the native architecture.
>> + (letrec-syntax ((matches (syntax-rules (=>)
>> + ((_ (system-prefix => target) rest ...)
>> + (if (string-prefix? system-prefix system)
>> + target
>> + (matches rest ...)))
>> + ((_)
>> + (error "LLVM target arch for system is unknown" system)))))
>> + (matches ("aarch64" => "AArch64")
>> + ("armhf" => "ARM")
>> + ("mips64el" => "Mips")
>> + ("powerpc" => "PowerPC")
>> + ("riscv64" => "RISCV64")
>> + ("x86_64" => "X86_64")
>> + ("i686" => "X86")
>> + ("i586" => "X86"))))
>
> The only different compared to ‘system->llvm-target’ is “riscv64”
> instead of “riscv”. Why not add that line to ‘system->llvm-target’
> instead of duplicating it?


```
-- Performing Test HAS_MAYBE_UNINITIALIZED
-- Performing Test HAS_MAYBE_UNINITIALIZED - Success
CMake Error at cmake/config-ix.cmake:502 (message):
Unknown architecture riscv
Call Stack (most recent call first):
CMakeLists.txt:776 (include)
```

because `LLVM_TARGETS_TO_BUILD' and `LLVM_TARGET_ARCH' is two
option. The parameters of expectation are different.
but for now, use same procedure `system->llvm-target'.


for llvm 15.0.7

LLVM_TARGETS_TO_BUILD: allow `AArch64 AMDGPU ARC ARM AVR BPF CSKY
DirectX Hexagon Lanai LoongArch M68k MSP430 Mips NVPTX PowerPC RISCV
SPIRV Sparc SystemZ VE WebAssembly X86 XCore`


LLVM_TARGET_ARCH: allow `i[2-6]86 x86 amd64 x86_64 sparc powerrpc ppc64le
aarch64 arm64 arm avr mips xcore msp430 hexagon s390x wasm32 wasm64
riscv32 riscv64 m68k`


if use same procedure, some target will fail.


Toggle quote (5 lines)
>
> Thanks,
> Ludo’.


--
over
I
I
iyzsong wrote on 7 Sep 2023 12:42
[PATCH v2] gnu: llvm: Fix riscv64 cross-compilation.
(address . 62438@debbugs.gnu.org)
60563288b330dca2f53335fe7e385420666fb04f.1694083301.git.iyzsong@member.fsf.org
From: Z572 <873216071@qq.com>

* gnu/packages/llvm.scm (system->llvm-target-arch): New procedure.
(llvm-15,llvm-14,llvm-12): Use It.
(system->llvm-target): Rewrite in terms of 'system->llvm-target-arch'.

Co-authored-by: ??? <iyzsong@member.fsf.org>
---
gnu/packages/llvm.scm | 25 +++++++++++++++++++------
1 file changed, 19 insertions(+), 6 deletions(-)

Toggle diff (71 lines)
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index daff67f7f2..cd551f4e02 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -85,19 +85,32 @@ (define* (system->llvm-target #:optional
"Return the LLVM target name that corresponds to SYSTEM, a system type such
as \"x86_64-linux\"."
;; See the 'lib/Target' directory of LLVM for a list of supported targets.
+ (match (system->llvm-target-arch system)
+ ("RISCV64" "RISCV")
+ ("X86_64" "X86")
+ (x x)))
+
+(define* (system->llvm-target-arch #:optional
+ (system (or (and=> (%current-target-system)
+ gnu-triplet->nix-system)
+ (%current-system))))
+ "Return the LLVM target arch name that corresponds to SYSTEM, a system type such
+as \"x86_64-linux\"."
+ ;; See the 'cmake/config-ix.cmake' file of LLVM for a list of supported targets arch.
+ ;; start with # Determine the native architecture.
(letrec-syntax ((matches (syntax-rules (=>)
((_ (system-prefix => target) rest ...)
(if (string-prefix? system-prefix system)
target
(matches rest ...)))
((_)
- (error "LLVM target for system is unknown" system)))))
+ (error "LLVM target arch for system is unknown" system)))))
(matches ("aarch64" => "AArch64")
("armhf" => "ARM")
("mips64el" => "Mips")
("powerpc" => "PowerPC")
- ("riscv" => "RISCV")
- ("x86_64" => "X86")
+ ("riscv64" => "RISCV64")
+ ("x86_64" => "X86_64")
("i686" => "X86")
("i586" => "X86"))))
@@ -598,7 +611,7 @@ (define-public llvm-15
#$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE="
(%current-target-system))
#$(string-append "-DLLVM_TARGET_ARCH="
- (system->llvm-target))
+ (system->llvm-target-arch))
#$(string-append "-DLLVM_TARGETS_TO_BUILD="
(system->llvm-target)))
'())
@@ -658,7 +671,7 @@ (define-public llvm-14
#$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE="
(%current-target-system))
#$(string-append "-DLLVM_TARGET_ARCH="
- (system->llvm-target))
+ (system->llvm-target-arch))
#$(string-append "-DLLVM_TARGETS_TO_BUILD="
(system->llvm-target)))
'())
@@ -901,7 +914,7 @@ (define-public llvm-12
#$(string-append "-DLLVM_DEFAULT_TARGET_TRIPLE="
(%current-target-system))
#$(string-append "-DLLVM_TARGET_ARCH="
- (system->llvm-target))
+ (system->llvm-target-arch))
#$(string-append "-DLLVM_TARGETS_TO_BUILD="
(system->llvm-target)))
#~())

base-commit: 5ef28595e9dff8b88ec3fcb4d887fbc380c9a8b8
--
2.41.0
L
L
Ludovic Courtès wrote on 19 Oct 2023 21:55
(address . iyzsong@envs.net)
87ttqmz8sn.fsf@gnu.org
Hi,

iyzsong@envs.net skribis:

Toggle quote (8 lines)
> From: Z572 <873216071@qq.com>
>
> * gnu/packages/llvm.scm (system->llvm-target-arch): New procedure.
> (llvm-15,llvm-14,llvm-12): Use It.
> (system->llvm-target): Rewrite in terms of 'system->llvm-target-arch'.
>
> Co-authored-by: ??? <iyzsong@member.fsf.org>

I guess you can go ahead and apply it (sorry for dropping the ball
earlier!).

Thanks,
Ludo’.
?
(name . Ludovic Courtès)(address . ludo@gnu.org)
8734y5aa3o.fsf@envs.net
Ludovic Courtès <ludo@gnu.org> writes:

Toggle quote (16 lines)
> Hi,
>
> iyzsong@envs.net skribis:
>
>> From: Z572 <873216071@qq.com>
>>
>> * gnu/packages/llvm.scm (system->llvm-target-arch): New procedure.
>> (llvm-15,llvm-14,llvm-12): Use It.
>> (system->llvm-target): Rewrite in terms of 'system->llvm-target-arch'.
>>
>> Co-authored-by: ??? <iyzsong@member.fsf.org>
>
> I guess you can go ahead and apply it (sorry for dropping the ball
> earlier!).
>

Pushed, thank you!
Closed
?