Relocation errors on LLVM / RISCV64 cross-builds
Summary
I suspect that LLVM builds for RISCV64 have issues with "far branches". This shows when linking libHSCabal
while building the quick-validate
flavor: The linker exits with an error, telling that the value of a R_RISCV_BRANCH
doesn't fit into the instruction.
The quick
Flavor does seem to be affected. This is likely accidental.
Steps to reproduce
- Use LLVM 15
- Configure with
--host=x86_64-unknown-linux-gnu --target=riscv64-unknown-linux-gnu
hadrian/build -j --docs=none --flavour=quick-validate
The significant logs are:
Command line: _build/stage0/bin/riscv64-unknown-linux-gnu-ghc -Wall -Wcompat -hisuf dyn_hi -osuf dyn_o -hcsuf dyn_hc -fPIC -dynamic -hide-all-packages -no-user-package-db '-package-env -' '-package-db _build/stage1/lib/package.conf.d' '-this-unit-id Cabal-3.11.0.0-inplace' '-this-package-name Cabal' '-package-id Cabal-syntax-3.11.0.0-inplace' '-package-id array-0.5.6.0-inplace' '-package-id base-4.20.0.0-inplace' '-package-id bytestring-0.12.1.0-inplace' '-package-id containers-0.7-inplace' '-package-id deepseq-1.5.0.0-inplace' '-package-id directory-1.3.8.3-inplace' '-package-id filepath-1.5.2.0-inplace' '-package-id mtl-2.3.1-inplace' '-package-id parsec-3.1.16.1-inplace' '-package-id pretty-1.1.3.6-inplace' '-package-id process-1.6.18.0-inplace' '-package-id time-1.12.2-inplace' '-package-id transformers-0.6.1.1-inplace' '-package-id unix-2.8.5.1-inplace' -i -i/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/libraries/Cabal/Cabal/build -i/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/libraries/Cabal/Cabal/build/autogen -i/home/sven/src/ghc-hadrian-cross-stage2-aarch64/libraries/Cabal/Cabal/src -Irts/include -I_build/stage1/libraries/Cabal/Cabal/build -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/libraries/process/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/libraries/process/build/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/libraries/directory -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/libraries/directory/build -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/libraries/unix/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/libraries/unix/build/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/libraries/time/lib/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/libraries/time/build/lib/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/libraries/containers/containers/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/libraries/containers/containers/build/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/libraries/bytestring/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/libraries/bytestring/build/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/libraries/ghc-internal/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/libraries/ghc-internal/build/include -I/nix/store/kqqrhz3hmacphbf5fvzvsw9bzmxyc9c5-gmp-with-cxx-riscv64-unknown-linux-gnu-6.3.0-dev/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/libraries/ghc-bignum/include/ -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/libraries/ghc-bignum/build/include/ -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/rts/include -I/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/rts/build/include -optP-include -optP_build/stage1/libraries/Cabal/Cabal/build/autogen/cabal_macros.h -optc-Qunused-arguments -outputdir _build/stage1/libraries/Cabal/Cabal/build -fdiagnostics-color=always -Wall -fno-ignore-asserts -fwarn-tabs -fwarn-incomplete-uni-patterns -fwarn-incomplete-record-updates -Wcompat -Wnoncanonical-monad-instances -Wunused-packages -XHaskell2010 -no-global-package-db -package-db=/home/sven/src/ghc-hadrian-cross-stage2-aarch64/_build/stage1/inplace/package.conf.d -ghcversion-file=rts/include/ghcversion.h -ghcversion-file=rts/include/ghcversion.h -dynamic -shared -dynload deploy -optl-Wl,-rpath,$ORIGIN -optl-Wl,-zorigin -fno-use-rpaths -no-auto-link-packages -Wnoncanonical-monad-instances -optc-Wno-unknown-pragmas _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/Configure.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/ComponentsGraph.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/ConfiguredComponent.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/DescribeUnitId.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/FullUnitId.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/LinkedComponent.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/ModSubst.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/ModuleShape.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/PreModuleShape.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Utils/IOData.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Utils/LogProgress.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Utils/MapAccum.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/CreatePipe.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/Directory.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/Environment.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/FilePath.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/Internal/TempFile.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/ResponseFile.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/Prelude/Internal.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/Process.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/Stack.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/Time.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Make.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/PackageDescription/Check.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/ReadE.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Bench.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Build.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Build/Inputs.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Build/Macros.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Build/PackageInfoModule.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Build/PathsModule.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/BuildPaths.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/BuildTarget.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/BuildToolDepends.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/CCompiler.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Command.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Compiler.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Configure.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Errors.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Flag.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/GHC.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/GHCJS.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Haddock.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Glob.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Glob/Internal.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/HaskellSuite.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Hpc.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Install.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/InstallDirs.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/InstallDirs/Internal.dyn_o _build/stage1/libraries/Cabal/
Cabal/build/Distribution/Simple/LocalBuildInfo.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/PackageDescription.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/PackageIndex.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/PreProcess.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/PreProcess/Types.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/PreProcess/Unlit.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/Ar.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/Builtin.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/Db.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/Find.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/GHC.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/HcPkg.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/Hpc.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/Internal.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/Ld.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/ResponseFile.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/Run.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/Script.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/Strip.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Program/Types.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Register.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/ShowBuildInfo.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/SrcDist.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Test.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Test/ExeV10.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Test/LibV09.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Test/Log.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/UHC.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/UserHooks.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Utils.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/TestSuite.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Types/AnnotatedId.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Types/ComponentInclude.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Types/DumpBuildInfo.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Types/PackageName/Magic.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Types/ComponentLocalBuildInfo.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Types/LocalBuildConfig.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Types/LocalBuildInfo.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Types/TargetInfo.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Types/GivenComponent.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Types/ParStrat.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Utils/Json.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Utils/NubList.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Utils/Progress.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Verbosity.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Verbosity/Internal.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/PreExistingComponent.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/ReadyComponent.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/MixLink.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/ModuleScope.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/UnifyM.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Backpack/Id.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Utils/UnionFind.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/Async.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/CopyFile.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/GetShortPathName.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Compat/SnocList.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/GetOpt.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Lex.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/PackageDescription/Check/Common.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/PackageDescription/Check/Conditional.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/PackageDescription/Check/Monad.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/PackageDescription/Check/Paths.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/PackageDescription/Check/Target.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/PackageDescription/Check/Warning.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Build/Macros/Z.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Build/PackageInfoModule/Z.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Build/PathsModule/Z.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/GHC/Build.dyn_o _build/stage1/librari
es/Cabal/Cabal/build/Distribution/Simple/GHC/Build/ExtraSources.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/GHC/Build/Link.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/GHC/Build/Modules.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/GHC/Build/Utils.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/GHC/EnvironmentParser.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/GHC/Internal.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/GHC/ImplInfo.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/ConfigureScript.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Benchmark.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Build.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Clean.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Common.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Config.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Copy.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Global.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Haddock.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Hscolour.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Install.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Register.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Repl.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/SDist.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/Simple/Setup/Test.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Distribution/ZinzaPrelude.dyn_o _build/stage1/libraries/Cabal/Cabal/build/Paths_Cabal.dyn_o -o _build/stage1/libraries/Cabal/Cabal/build/libHSCabal-3.11.0.0-inplace-ghc9.11.20240412.so -O -Werror -Wno-deprecated-flags
===> Command failed with error code: 1
_build/stage1/libraries/Cabal/Cabal/build/Distribution/PackageDescription/Check/Warning.dyn_o: in function `.LBB1111_3':
ghc_6.ll:(.text+0x21f60): relocation truncated to fit: R_RISCV_BRANCH against `.LBB1134_218'
clang-15: error: linker command failed with exit code 1 (use -v to see invocation)
`riscv64-unknown-linux-gnu-clang' failed in phase `Linker'. (Exit code: 1)
Error when running Shake build system:
at want, called at src/Main.hs:126:44 in main:Main
* Depends on: test
at need, called at src/Rules/Test.hs:188:9 in main:Rules.Test
* Depends on: test:ghc
at need, called at src/Rules/Test.hs:322:3 in main:Rules.Test
* Depends on: _build/stage1/lib/package.conf.d/Cabal-3.11.0.0-inplace.conf
at need, called at src/Rules/Register.hs:140:5 in main:Rules.Register
* Depends on: _build/stage1/libraries/Cabal/Cabal/build/stamp-Cabal-3.11.0.0-inplace_dyn
at need, called at src/Rules/Library.hs:144:3 in main:Rules.Library
* Depends on: _build/stage1/libraries/Cabal/Cabal/build/libHSCabal-3.11.0.0-inplace-ghc9.11.20240412.so
at cmd', called at src/Builder.hs:386:23 in main:Builder
at cmdArgs, called at src/Builder.hs:566:8 in main:Builder
at cmdArgs, called at src/Builder.hs:590:18 in main:Builder
at cmdArgs, called at src/Builder.hs:590:18 in main:Builder
at cmdArgs, called at src/Builder.hs:590:18 in main:Builder
at error, called at src/Builder.hs:635:13 in main:Builder
* Raised the exception:
Command failed
LD unfortunately logs the location of what it means to be the containing function:
0000000000021f5e <.LBB1111_3>:
21f5e: 89aa mv s3,a0
21f60: a001 j 21f60 <.LBB1111_3+0x2>
21f60: R_RISCV_RVC_JUMP .LBB1111_5
The relocations that would fit to the relocation error look like:
0000000000022bb4 <.LBB1134_16>:
22bb4: 00000597 auipc a1,0x0
22bb4: R_RISCV_PCREL_HI20 cUk0_info$def
22bb4: R_RISCV_RELAX *ABS*
22bb8: 00058593 mv a1,a1
22bb8: R_RISCV_PCREL_LO12_I .LBB1134_245
22bb8: R_RISCV_RELAX *ABS*
22bbc: 00b93023 sd a1,0(s2)
22bc0: 00153503 ld a0,1(a0)
22bc4: 007a7593 and a1,s4,7
22bc8: 00a93423 sd a0,8(s2)
22bcc: 00058063 beqz a1,22bcc <.LBB1134_16+0x18>
22bcc: R_RISCV_BRANCH .LBB1134_218
Expected behavior
Actually, I would expect the assembler to fix this issue as it should transform far branches: https://github.com/riscv-non-isa/riscv-asm-manual/blob/master/riscv-asm.md#far-branches
However, as it doesn't seem to do that (for unknown reasons), I would propose to apply this transformation manually in the GHC.CmmToLlvm.Mangler
.
Environment
-
GHC version used:
9.8.2
to buildmaster
(5e4f4ba8) -
System Architecture: RISCV64 (cross-target)