@@ -35,6 +35,7 @@ use libc::c_uint;
35
35
use std:: borrow:: Borrow ;
36
36
use std:: cell:: { Cell , RefCell } ;
37
37
use std:: ffi:: CStr ;
38
+ use std:: ffi:: CString ;
38
39
use std:: str;
39
40
40
41
/// There is one `CodegenCx` per compilation unit. Each one has its own LLVM
@@ -180,13 +181,13 @@ pub unsafe fn create_module<'ll>(
180
181
// to ensure intrinsic calls don't use it.
181
182
if !sess. needs_plt ( ) {
182
183
let avoid_plt = c"RtLibUseGOT" . as_ptr ( ) . cast ( ) ;
183
- llvm:: LLVMRustAddModuleFlag ( llmod, llvm:: LLVMModFlagBehavior :: Warning , avoid_plt, 1 ) ;
184
+ llvm:: LLVMRustAddModuleFlagU32 ( llmod, llvm:: LLVMModFlagBehavior :: Warning , avoid_plt, 1 ) ;
184
185
}
185
186
186
187
// Enable canonical jump tables if CFI is enabled. (See https://reviews.llvm.org/D65629.)
187
188
if sess. is_sanitizer_cfi_canonical_jump_tables_enabled ( ) && sess. is_sanitizer_cfi_enabled ( ) {
188
189
let canonical_jump_tables = c"CFI Canonical Jump Tables" . as_ptr ( ) . cast ( ) ;
189
- llvm:: LLVMRustAddModuleFlag (
190
+ llvm:: LLVMRustAddModuleFlagU32 (
190
191
llmod,
191
192
llvm:: LLVMModFlagBehavior :: Override ,
192
193
canonical_jump_tables,
@@ -197,7 +198,7 @@ pub unsafe fn create_module<'ll>(
197
198
// Enable LTO unit splitting if specified or if CFI is enabled. (See https://reviews.llvm.org/D53891.)
198
199
if sess. is_split_lto_unit_enabled ( ) || sess. is_sanitizer_cfi_enabled ( ) {
199
200
let enable_split_lto_unit = c"EnableSplitLTOUnit" . as_ptr ( ) . cast ( ) ;
200
- llvm:: LLVMRustAddModuleFlag (
201
+ llvm:: LLVMRustAddModuleFlagU32 (
201
202
llmod,
202
203
llvm:: LLVMModFlagBehavior :: Override ,
203
204
enable_split_lto_unit,
@@ -208,7 +209,7 @@ pub unsafe fn create_module<'ll>(
208
209
// Add "kcfi" module flag if KCFI is enabled. (See https://reviews.llvm.org/D119296.)
209
210
if sess. is_sanitizer_kcfi_enabled ( ) {
210
211
let kcfi = c"kcfi" . as_ptr ( ) . cast ( ) ;
211
- llvm:: LLVMRustAddModuleFlag ( llmod, llvm:: LLVMModFlagBehavior :: Override , kcfi, 1 ) ;
212
+ llvm:: LLVMRustAddModuleFlagU32 ( llmod, llvm:: LLVMModFlagBehavior :: Override , kcfi, 1 ) ;
212
213
}
213
214
214
215
// Control Flow Guard is currently only supported by the MSVC linker on Windows.
@@ -217,7 +218,7 @@ pub unsafe fn create_module<'ll>(
217
218
CFGuard :: Disabled => { }
218
219
CFGuard :: NoChecks => {
219
220
// Set `cfguard=1` module flag to emit metadata only.
220
- llvm:: LLVMRustAddModuleFlag (
221
+ llvm:: LLVMRustAddModuleFlagU32 (
221
222
llmod,
222
223
llvm:: LLVMModFlagBehavior :: Warning ,
223
224
c"cfguard" . as_ptr ( ) as * const _ ,
@@ -226,7 +227,7 @@ pub unsafe fn create_module<'ll>(
226
227
}
227
228
CFGuard :: Checks => {
228
229
// Set `cfguard=2` module flag to emit metadata and checks.
229
- llvm:: LLVMRustAddModuleFlag (
230
+ llvm:: LLVMRustAddModuleFlagU32 (
230
231
llmod,
231
232
llvm:: LLVMModFlagBehavior :: Warning ,
232
233
c"cfguard" . as_ptr ( ) as * const _ ,
@@ -238,26 +239,26 @@ pub unsafe fn create_module<'ll>(
238
239
239
240
if let Some ( BranchProtection { bti, pac_ret } ) = sess. opts . unstable_opts . branch_protection {
240
241
if sess. target . arch == "aarch64" {
241
- llvm:: LLVMRustAddModuleFlag (
242
+ llvm:: LLVMRustAddModuleFlagU32 (
242
243
llmod,
243
244
llvm:: LLVMModFlagBehavior :: Min ,
244
245
c"branch-target-enforcement" . as_ptr ( ) . cast ( ) ,
245
246
bti. into ( ) ,
246
247
) ;
247
- llvm:: LLVMRustAddModuleFlag (
248
+ llvm:: LLVMRustAddModuleFlagU32 (
248
249
llmod,
249
250
llvm:: LLVMModFlagBehavior :: Min ,
250
251
c"sign-return-address" . as_ptr ( ) . cast ( ) ,
251
252
pac_ret. is_some ( ) . into ( ) ,
252
253
) ;
253
254
let pac_opts = pac_ret. unwrap_or ( PacRet { leaf : false , key : PAuthKey :: A } ) ;
254
- llvm:: LLVMRustAddModuleFlag (
255
+ llvm:: LLVMRustAddModuleFlagU32 (
255
256
llmod,
256
257
llvm:: LLVMModFlagBehavior :: Min ,
257
258
c"sign-return-address-all" . as_ptr ( ) . cast ( ) ,
258
259
pac_opts. leaf . into ( ) ,
259
260
) ;
260
- llvm:: LLVMRustAddModuleFlag (
261
+ llvm:: LLVMRustAddModuleFlagU32 (
261
262
llmod,
262
263
llvm:: LLVMModFlagBehavior :: Min ,
263
264
c"sign-return-address-with-bkey" . as_ptr ( ) . cast ( ) ,
@@ -273,15 +274,15 @@ pub unsafe fn create_module<'ll>(
273
274
274
275
// Pass on the control-flow protection flags to LLVM (equivalent to `-fcf-protection` in Clang).
275
276
if let CFProtection :: Branch | CFProtection :: Full = sess. opts . unstable_opts . cf_protection {
276
- llvm:: LLVMRustAddModuleFlag (
277
+ llvm:: LLVMRustAddModuleFlagU32 (
277
278
llmod,
278
279
llvm:: LLVMModFlagBehavior :: Override ,
279
280
c"cf-protection-branch" . as_ptr ( ) . cast ( ) ,
280
281
1 ,
281
282
)
282
283
}
283
284
if let CFProtection :: Return | CFProtection :: Full = sess. opts . unstable_opts . cf_protection {
284
- llvm:: LLVMRustAddModuleFlag (
285
+ llvm:: LLVMRustAddModuleFlagU32 (
285
286
llmod,
286
287
llvm:: LLVMModFlagBehavior :: Override ,
287
288
c"cf-protection-return" . as_ptr ( ) . cast ( ) ,
@@ -290,7 +291,7 @@ pub unsafe fn create_module<'ll>(
290
291
}
291
292
292
293
if sess. opts . unstable_opts . virtual_function_elimination {
293
- llvm:: LLVMRustAddModuleFlag (
294
+ llvm:: LLVMRustAddModuleFlagU32 (
294
295
llmod,
295
296
llvm:: LLVMModFlagBehavior :: Error ,
296
297
c"Virtual Function Elim" . as_ptr ( ) . cast ( ) ,
@@ -300,7 +301,7 @@ pub unsafe fn create_module<'ll>(
300
301
301
302
// Set module flag to enable Windows EHCont Guard (/guard:ehcont).
302
303
if sess. opts . unstable_opts . ehcont_guard {
303
- llvm:: LLVMRustAddModuleFlag (
304
+ llvm:: LLVMRustAddModuleFlagU32 (
304
305
llmod,
305
306
llvm:: LLVMModFlagBehavior :: Warning ,
306
307
c"ehcontguard" . as_ptr ( ) as * const _ ,
@@ -326,6 +327,23 @@ pub unsafe fn create_module<'ll>(
326
327
llvm:: LLVMMDNodeInContext ( llcx, & name_metadata, 1 ) ,
327
328
) ;
328
329
330
+ // Emit RISC-V specific target-abi metadata
331
+ // to workaround lld as the LTO plugin not
332
+ // correctly setting target-abi for the LTO object
333
+ // FIXME: https://github.com/llvm/llvm-project/issues/50591
334
+ // If llvm_abiname is empty, emit nothing.
335
+ if matches ! ( sess. target. arch. as_ref( ) , "riscv32" | "riscv64" )
336
+ && !sess. target . options . llvm_abiname . is_empty ( )
337
+ {
338
+ let llvm_abiname = CString :: new ( sess. target . options . llvm_abiname . as_ref ( ) ) . unwrap ( ) ;
339
+ llvm:: LLVMRustAddModuleFlagString (
340
+ llmod,
341
+ llvm:: LLVMModFlagBehavior :: Error ,
342
+ c"target-abi" . as_ptr ( ) as * const _ ,
343
+ llvm_abiname. as_ptr ( ) as * const _ ,
344
+ ) ;
345
+ }
346
+
329
347
// Add module flags specified via -Z llvm_module_flag
330
348
for ( key, value, behavior) in & sess. opts . unstable_opts . llvm_module_flag {
331
349
let key = format ! ( "{key}\0 " ) ;
@@ -341,7 +359,7 @@ pub unsafe fn create_module<'ll>(
341
359
// We already checked this during option parsing
342
360
_ => unreachable ! ( ) ,
343
361
} ;
344
- llvm:: LLVMRustAddModuleFlag ( llmod, behavior, key. as_ptr ( ) . cast ( ) , * value)
362
+ llvm:: LLVMRustAddModuleFlagU32 ( llmod, behavior, key. as_ptr ( ) . cast ( ) , * value)
345
363
}
346
364
347
365
llmod
0 commit comments