@@ -180,13 +180,13 @@ pub unsafe fn create_module<'ll>(
180
180
// to ensure intrinsic calls don't use it.
181
181
if !sess. needs_plt ( ) {
182
182
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 ) ;
184
184
}
185
185
186
186
// Enable canonical jump tables if CFI is enabled. (See https://reviews.llvm.org/D65629.)
187
187
if sess. is_sanitizer_cfi_canonical_jump_tables_enabled ( ) && sess. is_sanitizer_cfi_enabled ( ) {
188
188
let canonical_jump_tables = c"CFI Canonical Jump Tables" . as_ptr ( ) . cast ( ) ;
189
- llvm:: LLVMRustAddModuleFlag (
189
+ llvm:: LLVMRustAddModuleFlagU32 (
190
190
llmod,
191
191
llvm:: LLVMModFlagBehavior :: Override ,
192
192
canonical_jump_tables,
@@ -197,7 +197,7 @@ pub unsafe fn create_module<'ll>(
197
197
// Enable LTO unit splitting if specified or if CFI is enabled. (See https://reviews.llvm.org/D53891.)
198
198
if sess. is_split_lto_unit_enabled ( ) || sess. is_sanitizer_cfi_enabled ( ) {
199
199
let enable_split_lto_unit = c"EnableSplitLTOUnit" . as_ptr ( ) . cast ( ) ;
200
- llvm:: LLVMRustAddModuleFlag (
200
+ llvm:: LLVMRustAddModuleFlagU32 (
201
201
llmod,
202
202
llvm:: LLVMModFlagBehavior :: Override ,
203
203
enable_split_lto_unit,
@@ -208,7 +208,7 @@ pub unsafe fn create_module<'ll>(
208
208
// Add "kcfi" module flag if KCFI is enabled. (See https://reviews.llvm.org/D119296.)
209
209
if sess. is_sanitizer_kcfi_enabled ( ) {
210
210
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 ) ;
212
212
}
213
213
214
214
// Control Flow Guard is currently only supported by the MSVC linker on Windows.
@@ -217,7 +217,7 @@ pub unsafe fn create_module<'ll>(
217
217
CFGuard :: Disabled => { }
218
218
CFGuard :: NoChecks => {
219
219
// Set `cfguard=1` module flag to emit metadata only.
220
- llvm:: LLVMRustAddModuleFlag (
220
+ llvm:: LLVMRustAddModuleFlagU32 (
221
221
llmod,
222
222
llvm:: LLVMModFlagBehavior :: Warning ,
223
223
c"cfguard" . as_ptr ( ) as * const _ ,
@@ -226,7 +226,7 @@ pub unsafe fn create_module<'ll>(
226
226
}
227
227
CFGuard :: Checks => {
228
228
// Set `cfguard=2` module flag to emit metadata and checks.
229
- llvm:: LLVMRustAddModuleFlag (
229
+ llvm:: LLVMRustAddModuleFlagU32 (
230
230
llmod,
231
231
llvm:: LLVMModFlagBehavior :: Warning ,
232
232
c"cfguard" . as_ptr ( ) as * const _ ,
@@ -238,26 +238,26 @@ pub unsafe fn create_module<'ll>(
238
238
239
239
if let Some ( BranchProtection { bti, pac_ret } ) = sess. opts . unstable_opts . branch_protection {
240
240
if sess. target . arch == "aarch64" {
241
- llvm:: LLVMRustAddModuleFlag (
241
+ llvm:: LLVMRustAddModuleFlagU32 (
242
242
llmod,
243
243
llvm:: LLVMModFlagBehavior :: Min ,
244
244
c"branch-target-enforcement" . as_ptr ( ) . cast ( ) ,
245
245
bti. into ( ) ,
246
246
) ;
247
- llvm:: LLVMRustAddModuleFlag (
247
+ llvm:: LLVMRustAddModuleFlagU32 (
248
248
llmod,
249
249
llvm:: LLVMModFlagBehavior :: Min ,
250
250
c"sign-return-address" . as_ptr ( ) . cast ( ) ,
251
251
pac_ret. is_some ( ) . into ( ) ,
252
252
) ;
253
253
let pac_opts = pac_ret. unwrap_or ( PacRet { leaf : false , key : PAuthKey :: A } ) ;
254
- llvm:: LLVMRustAddModuleFlag (
254
+ llvm:: LLVMRustAddModuleFlagU32 (
255
255
llmod,
256
256
llvm:: LLVMModFlagBehavior :: Min ,
257
257
c"sign-return-address-all" . as_ptr ( ) . cast ( ) ,
258
258
pac_opts. leaf . into ( ) ,
259
259
) ;
260
- llvm:: LLVMRustAddModuleFlag (
260
+ llvm:: LLVMRustAddModuleFlagU32 (
261
261
llmod,
262
262
llvm:: LLVMModFlagBehavior :: Min ,
263
263
c"sign-return-address-with-bkey" . as_ptr ( ) . cast ( ) ,
@@ -273,15 +273,15 @@ pub unsafe fn create_module<'ll>(
273
273
274
274
// Pass on the control-flow protection flags to LLVM (equivalent to `-fcf-protection` in Clang).
275
275
if let CFProtection :: Branch | CFProtection :: Full = sess. opts . unstable_opts . cf_protection {
276
- llvm:: LLVMRustAddModuleFlag (
276
+ llvm:: LLVMRustAddModuleFlagU32 (
277
277
llmod,
278
278
llvm:: LLVMModFlagBehavior :: Override ,
279
279
c"cf-protection-branch" . as_ptr ( ) . cast ( ) ,
280
280
1 ,
281
281
)
282
282
}
283
283
if let CFProtection :: Return | CFProtection :: Full = sess. opts . unstable_opts . cf_protection {
284
- llvm:: LLVMRustAddModuleFlag (
284
+ llvm:: LLVMRustAddModuleFlagU32 (
285
285
llmod,
286
286
llvm:: LLVMModFlagBehavior :: Override ,
287
287
c"cf-protection-return" . as_ptr ( ) . cast ( ) ,
@@ -290,7 +290,7 @@ pub unsafe fn create_module<'ll>(
290
290
}
291
291
292
292
if sess. opts . unstable_opts . virtual_function_elimination {
293
- llvm:: LLVMRustAddModuleFlag (
293
+ llvm:: LLVMRustAddModuleFlagU32 (
294
294
llmod,
295
295
llvm:: LLVMModFlagBehavior :: Error ,
296
296
c"Virtual Function Elim" . as_ptr ( ) . cast ( ) ,
@@ -300,7 +300,7 @@ pub unsafe fn create_module<'ll>(
300
300
301
301
// Set module flag to enable Windows EHCont Guard (/guard:ehcont).
302
302
if sess. opts . unstable_opts . ehcont_guard {
303
- llvm:: LLVMRustAddModuleFlag (
303
+ llvm:: LLVMRustAddModuleFlagU32 (
304
304
llmod,
305
305
llvm:: LLVMModFlagBehavior :: Warning ,
306
306
c"ehcontguard" . as_ptr ( ) as * const _ ,
@@ -326,6 +326,22 @@ pub unsafe fn create_module<'ll>(
326
326
llvm:: LLVMMDNodeInContext ( llcx, & name_metadata, 1 ) ,
327
327
) ;
328
328
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
+
329
345
// Add module flags specified via -Z llvm_module_flag
330
346
for ( key, value, behavior) in & sess. opts . unstable_opts . llvm_module_flag {
331
347
let key = format ! ( "{key}\0 " ) ;
@@ -341,7 +357,7 @@ pub unsafe fn create_module<'ll>(
341
357
// We already checked this during option parsing
342
358
_ => unreachable ! ( ) ,
343
359
} ;
344
- llvm:: LLVMRustAddModuleFlag ( llmod, behavior, key. as_ptr ( ) . cast ( ) , * value)
360
+ llvm:: LLVMRustAddModuleFlagU32 ( llmod, behavior, key. as_ptr ( ) . cast ( ) , * value)
345
361
}
346
362
347
363
llmod
0 commit comments