@@ -180,13 +180,13 @@ pub unsafe fn create_module<'ll>(
180180 // to ensure intrinsic calls don't use it.
181181 if !sess. needs_plt ( ) {
182182 let avoid_plt = c"RtLibUseGOT" . as_ptr ( ) . cast ( ) ;
183- llvm:: LLVMRustAddModuleFlag ( llmod, llvm:: LLVMModFlagBehavior :: Warning , avoid_plt, 1 ) ;
183+ llvm:: LLVMRustAddModuleFlagU32 ( llmod, llvm:: LLVMModFlagBehavior :: Warning , avoid_plt, 1 ) ;
184184 }
185185
186186 // Enable canonical jump tables if CFI is enabled. (See https://reviews.llvm.org/D65629.)
187187 if sess. is_sanitizer_cfi_canonical_jump_tables_enabled ( ) && sess. is_sanitizer_cfi_enabled ( ) {
188188 let canonical_jump_tables = c"CFI Canonical Jump Tables" . as_ptr ( ) . cast ( ) ;
189- llvm:: LLVMRustAddModuleFlag (
189+ llvm:: LLVMRustAddModuleFlagU32 (
190190 llmod,
191191 llvm:: LLVMModFlagBehavior :: Override ,
192192 canonical_jump_tables,
@@ -197,7 +197,7 @@ pub unsafe fn create_module<'ll>(
197197 // Enable LTO unit splitting if specified or if CFI is enabled. (See https://reviews.llvm.org/D53891.)
198198 if sess. is_split_lto_unit_enabled ( ) || sess. is_sanitizer_cfi_enabled ( ) {
199199 let enable_split_lto_unit = c"EnableSplitLTOUnit" . as_ptr ( ) . cast ( ) ;
200- llvm:: LLVMRustAddModuleFlag (
200+ llvm:: LLVMRustAddModuleFlagU32 (
201201 llmod,
202202 llvm:: LLVMModFlagBehavior :: Override ,
203203 enable_split_lto_unit,
@@ -208,7 +208,7 @@ pub unsafe fn create_module<'ll>(
208208 // Add "kcfi" module flag if KCFI is enabled. (See https://reviews.llvm.org/D119296.)
209209 if sess. is_sanitizer_kcfi_enabled ( ) {
210210 let kcfi = c"kcfi" . as_ptr ( ) . cast ( ) ;
211- llvm:: LLVMRustAddModuleFlag ( llmod, llvm:: LLVMModFlagBehavior :: Override , kcfi, 1 ) ;
211+ llvm:: LLVMRustAddModuleFlagU32 ( llmod, llvm:: LLVMModFlagBehavior :: Override , kcfi, 1 ) ;
212212 }
213213
214214 // Control Flow Guard is currently only supported by the MSVC linker on Windows.
@@ -217,7 +217,7 @@ pub unsafe fn create_module<'ll>(
217217 CFGuard :: Disabled => { }
218218 CFGuard :: NoChecks => {
219219 // Set `cfguard=1` module flag to emit metadata only.
220- llvm:: LLVMRustAddModuleFlag (
220+ llvm:: LLVMRustAddModuleFlagU32 (
221221 llmod,
222222 llvm:: LLVMModFlagBehavior :: Warning ,
223223 c"cfguard" . as_ptr ( ) as * const _ ,
@@ -226,7 +226,7 @@ pub unsafe fn create_module<'ll>(
226226 }
227227 CFGuard :: Checks => {
228228 // Set `cfguard=2` module flag to emit metadata and checks.
229- llvm:: LLVMRustAddModuleFlag (
229+ llvm:: LLVMRustAddModuleFlagU32 (
230230 llmod,
231231 llvm:: LLVMModFlagBehavior :: Warning ,
232232 c"cfguard" . as_ptr ( ) as * const _ ,
@@ -238,26 +238,26 @@ pub unsafe fn create_module<'ll>(
238238
239239 if let Some ( BranchProtection { bti, pac_ret } ) = sess. opts . unstable_opts . branch_protection {
240240 if sess. target . arch == "aarch64" {
241- llvm:: LLVMRustAddModuleFlag (
241+ llvm:: LLVMRustAddModuleFlagU32 (
242242 llmod,
243243 llvm:: LLVMModFlagBehavior :: Min ,
244244 c"branch-target-enforcement" . as_ptr ( ) . cast ( ) ,
245245 bti. into ( ) ,
246246 ) ;
247- llvm:: LLVMRustAddModuleFlag (
247+ llvm:: LLVMRustAddModuleFlagU32 (
248248 llmod,
249249 llvm:: LLVMModFlagBehavior :: Min ,
250250 c"sign-return-address" . as_ptr ( ) . cast ( ) ,
251251 pac_ret. is_some ( ) . into ( ) ,
252252 ) ;
253253 let pac_opts = pac_ret. unwrap_or ( PacRet { leaf : false , key : PAuthKey :: A } ) ;
254- llvm:: LLVMRustAddModuleFlag (
254+ llvm:: LLVMRustAddModuleFlagU32 (
255255 llmod,
256256 llvm:: LLVMModFlagBehavior :: Min ,
257257 c"sign-return-address-all" . as_ptr ( ) . cast ( ) ,
258258 pac_opts. leaf . into ( ) ,
259259 ) ;
260- llvm:: LLVMRustAddModuleFlag (
260+ llvm:: LLVMRustAddModuleFlagU32 (
261261 llmod,
262262 llvm:: LLVMModFlagBehavior :: Min ,
263263 c"sign-return-address-with-bkey" . as_ptr ( ) . cast ( ) ,
@@ -273,15 +273,15 @@ pub unsafe fn create_module<'ll>(
273273
274274 // Pass on the control-flow protection flags to LLVM (equivalent to `-fcf-protection` in Clang).
275275 if let CFProtection :: Branch | CFProtection :: Full = sess. opts . unstable_opts . cf_protection {
276- llvm:: LLVMRustAddModuleFlag (
276+ llvm:: LLVMRustAddModuleFlagU32 (
277277 llmod,
278278 llvm:: LLVMModFlagBehavior :: Override ,
279279 c"cf-protection-branch" . as_ptr ( ) . cast ( ) ,
280280 1 ,
281281 )
282282 }
283283 if let CFProtection :: Return | CFProtection :: Full = sess. opts . unstable_opts . cf_protection {
284- llvm:: LLVMRustAddModuleFlag (
284+ llvm:: LLVMRustAddModuleFlagU32 (
285285 llmod,
286286 llvm:: LLVMModFlagBehavior :: Override ,
287287 c"cf-protection-return" . as_ptr ( ) . cast ( ) ,
@@ -290,7 +290,7 @@ pub unsafe fn create_module<'ll>(
290290 }
291291
292292 if sess. opts . unstable_opts . virtual_function_elimination {
293- llvm:: LLVMRustAddModuleFlag (
293+ llvm:: LLVMRustAddModuleFlagU32 (
294294 llmod,
295295 llvm:: LLVMModFlagBehavior :: Error ,
296296 c"Virtual Function Elim" . as_ptr ( ) . cast ( ) ,
@@ -300,7 +300,7 @@ pub unsafe fn create_module<'ll>(
300300
301301 // Set module flag to enable Windows EHCont Guard (/guard:ehcont).
302302 if sess. opts . unstable_opts . ehcont_guard {
303- llvm:: LLVMRustAddModuleFlag (
303+ llvm:: LLVMRustAddModuleFlagU32 (
304304 llmod,
305305 llvm:: LLVMModFlagBehavior :: Warning ,
306306 c"ehcontguard" . as_ptr ( ) as * const _ ,
@@ -326,6 +326,22 @@ pub unsafe fn create_module<'ll>(
326326 llvm:: LLVMMDNodeInContext ( llcx, & name_metadata, 1 ) ,
327327 ) ;
328328
329+ // Emit RISC-V specific target-abi metadata
330+ // to workaround lld as the LTO plugin not
331+ // correctly setting target-abi for the LTO object
332+ // FIXME: https://github.com/llvm/llvm-project/issues/50591
333+ // If llvm_abiname is empty, emit nothing.
334+ let llvm_abiname = & sess. target . options . llvm_abiname ;
335+ if matches ! ( sess. target. arch. as_ref( ) , "riscv32" | "riscv64" ) && !llvm_abiname. is_empty ( ) {
336+ llvm:: LLVMRustAddModuleFlagString (
337+ llmod,
338+ llvm:: LLVMModFlagBehavior :: Error ,
339+ c"target-abi" . as_ptr ( ) ,
340+ llvm_abiname. as_ptr ( ) . cast ( ) ,
341+ llvm_abiname. len ( ) ,
342+ ) ;
343+ }
344+
329345 // Add module flags specified via -Z llvm_module_flag
330346 for ( key, value, behavior) in & sess. opts . unstable_opts . llvm_module_flag {
331347 let key = format ! ( "{key}\0 " ) ;
@@ -341,7 +357,7 @@ pub unsafe fn create_module<'ll>(
341357 // We already checked this during option parsing
342358 _ => unreachable ! ( ) ,
343359 } ;
344- llvm:: LLVMRustAddModuleFlag ( llmod, behavior, key. as_ptr ( ) . cast ( ) , * value)
360+ llvm:: LLVMRustAddModuleFlagU32 ( llmod, behavior, key. as_ptr ( ) . cast ( ) , * value)
345361 }
346362
347363 llmod
0 commit comments