On riscv64 LTO fails for some ports with this error:
ld: error: linking module flags 'SmallDataLimit': IDs have conflicting values in '<REDACTED>.o' and 'ld-temp.o' This is because some objects files are built PIC and others with PIE or no PIC at all, and the final link which creates ld-temp.o fails to take this into account. The problem is specific to LTO on riscv64, regular ELF linking isn't affected. This issue has been reported upstream recently, with a fix that uses llvm::Module::Min: https://reviews.llvm.org/D131230 Our llvm version doesn't support llvm::Module::Min so instead of backporting all/some parts of: https://github.com/llvm/llvm-project/commit/b0343a38a5910e980bb031e4014655d77cd0c162 I suggest we just replace llvm::Module::Error with llvm::Module::Warning here. Except for the pointless warnings, the end result would hopefully be the same: the first (and lowest) value is used, the second value from ld-temp.o is ignored. This will help me get the same LTO support on riscv64 as on other archs. Ports affected so far: games/arx-libertatis, multimedia/svt-av1, net/rrdtool, net/wireshark. I'm sure the list will get longer. ok? Index: clang/lib/CodeGen/CodeGenModule.cpp =================================================================== RCS file: /cvs/src/gnu/llvm/clang/lib/CodeGen/CodeGenModule.cpp,v retrieving revision 1.1.1.4 diff -u -p -r1.1.1.4 CodeGenModule.cpp --- clang/lib/CodeGen/CodeGenModule.cpp 17 Dec 2021 12:24:37 -0000 1.1.1.4 +++ clang/lib/CodeGen/CodeGenModule.cpp 15 Dec 2022 22:35:55 -0000 @@ -846,7 +846,7 @@ void CodeGenModule::EmitBackendOptionsMe break; case llvm::Triple::riscv32: case llvm::Triple::riscv64: - getModule().addModuleFlag(llvm::Module::Error, "SmallDataLimit", + getModule().addModuleFlag(llvm::Module::Warning, "SmallDataLimit", CodeGenOpts.SmallDataLimit); break; } -- jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE
