@@ -35,6 +35,7 @@ use libc::c_uint;
3535use std:: borrow:: Borrow ;
3636use std:: cell:: { Cell , RefCell } ;
3737use std:: ffi:: CStr ;
38+ use std:: ffi:: CString ;
3839use std:: str;
3940
4041/// There is one `CodegenCx` per compilation unit. Each one has its own LLVM
@@ -180,13 +181,13 @@ pub unsafe fn create_module<'ll>(
180181 // to ensure intrinsic calls don't use it.
181182 if !sess. needs_plt ( ) {
182183 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 ) ;
184185 }
185186
186187 // Enable canonical jump tables if CFI is enabled. (See https://reviews.llvm.org/D65629.)
187188 if sess. is_sanitizer_cfi_canonical_jump_tables_enabled ( ) && sess. is_sanitizer_cfi_enabled ( ) {
188189 let canonical_jump_tables = c"CFI Canonical Jump Tables" . as_ptr ( ) . cast ( ) ;
189- llvm:: LLVMRustAddModuleFlag (
190+ llvm:: LLVMRustAddModuleFlagU32 (
190191 llmod,
191192 llvm:: LLVMModFlagBehavior :: Override ,
192193 canonical_jump_tables,
@@ -197,7 +198,7 @@ pub unsafe fn create_module<'ll>(
197198 // Enable LTO unit splitting if specified or if CFI is enabled. (See https://reviews.llvm.org/D53891.)
198199 if sess. is_split_lto_unit_enabled ( ) || sess. is_sanitizer_cfi_enabled ( ) {
199200 let enable_split_lto_unit = c"EnableSplitLTOUnit" . as_ptr ( ) . cast ( ) ;
200- llvm:: LLVMRustAddModuleFlag (
201+ llvm:: LLVMRustAddModuleFlagU32 (
201202 llmod,
202203 llvm:: LLVMModFlagBehavior :: Override ,
203204 enable_split_lto_unit,
@@ -208,7 +209,7 @@ pub unsafe fn create_module<'ll>(
208209 // Add "kcfi" module flag if KCFI is enabled. (See https://reviews.llvm.org/D119296.)
209210 if sess. is_sanitizer_kcfi_enabled ( ) {
210211 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 ) ;
212213 }
213214
214215 // Control Flow Guard is currently only supported by the MSVC linker on Windows.
@@ -217,7 +218,7 @@ pub unsafe fn create_module<'ll>(
217218 CFGuard :: Disabled => { }
218219 CFGuard :: NoChecks => {
219220 // Set `cfguard=1` module flag to emit metadata only.
220- llvm:: LLVMRustAddModuleFlag (
221+ llvm:: LLVMRustAddModuleFlagU32 (
221222 llmod,
222223 llvm:: LLVMModFlagBehavior :: Warning ,
223224 c"cfguard" . as_ptr ( ) as * const _ ,
@@ -226,7 +227,7 @@ pub unsafe fn create_module<'ll>(
226227 }
227228 CFGuard :: Checks => {
228229 // Set `cfguard=2` module flag to emit metadata and checks.
229- llvm:: LLVMRustAddModuleFlag (
230+ llvm:: LLVMRustAddModuleFlagU32 (
230231 llmod,
231232 llvm:: LLVMModFlagBehavior :: Warning ,
232233 c"cfguard" . as_ptr ( ) as * const _ ,
@@ -238,26 +239,26 @@ pub unsafe fn create_module<'ll>(
238239
239240 if let Some ( BranchProtection { bti, pac_ret } ) = sess. opts . unstable_opts . branch_protection {
240241 if sess. target . arch == "aarch64" {
241- llvm:: LLVMRustAddModuleFlag (
242+ llvm:: LLVMRustAddModuleFlagU32 (
242243 llmod,
243244 llvm:: LLVMModFlagBehavior :: Min ,
244245 c"branch-target-enforcement" . as_ptr ( ) . cast ( ) ,
245246 bti. into ( ) ,
246247 ) ;
247- llvm:: LLVMRustAddModuleFlag (
248+ llvm:: LLVMRustAddModuleFlagU32 (
248249 llmod,
249250 llvm:: LLVMModFlagBehavior :: Min ,
250251 c"sign-return-address" . as_ptr ( ) . cast ( ) ,
251252 pac_ret. is_some ( ) . into ( ) ,
252253 ) ;
253254 let pac_opts = pac_ret. unwrap_or ( PacRet { leaf : false , key : PAuthKey :: A } ) ;
254- llvm:: LLVMRustAddModuleFlag (
255+ llvm:: LLVMRustAddModuleFlagU32 (
255256 llmod,
256257 llvm:: LLVMModFlagBehavior :: Min ,
257258 c"sign-return-address-all" . as_ptr ( ) . cast ( ) ,
258259 pac_opts. leaf . into ( ) ,
259260 ) ;
260- llvm:: LLVMRustAddModuleFlag (
261+ llvm:: LLVMRustAddModuleFlagU32 (
261262 llmod,
262263 llvm:: LLVMModFlagBehavior :: Min ,
263264 c"sign-return-address-with-bkey" . as_ptr ( ) . cast ( ) ,
@@ -273,15 +274,15 @@ pub unsafe fn create_module<'ll>(
273274
274275 // Pass on the control-flow protection flags to LLVM (equivalent to `-fcf-protection` in Clang).
275276 if let CFProtection :: Branch | CFProtection :: Full = sess. opts . unstable_opts . cf_protection {
276- llvm:: LLVMRustAddModuleFlag (
277+ llvm:: LLVMRustAddModuleFlagU32 (
277278 llmod,
278279 llvm:: LLVMModFlagBehavior :: Override ,
279280 c"cf-protection-branch" . as_ptr ( ) . cast ( ) ,
280281 1 ,
281282 )
282283 }
283284 if let CFProtection :: Return | CFProtection :: Full = sess. opts . unstable_opts . cf_protection {
284- llvm:: LLVMRustAddModuleFlag (
285+ llvm:: LLVMRustAddModuleFlagU32 (
285286 llmod,
286287 llvm:: LLVMModFlagBehavior :: Override ,
287288 c"cf-protection-return" . as_ptr ( ) . cast ( ) ,
@@ -290,7 +291,7 @@ pub unsafe fn create_module<'ll>(
290291 }
291292
292293 if sess. opts . unstable_opts . virtual_function_elimination {
293- llvm:: LLVMRustAddModuleFlag (
294+ llvm:: LLVMRustAddModuleFlagU32 (
294295 llmod,
295296 llvm:: LLVMModFlagBehavior :: Error ,
296297 c"Virtual Function Elim" . as_ptr ( ) . cast ( ) ,
@@ -300,7 +301,7 @@ pub unsafe fn create_module<'ll>(
300301
301302 // Set module flag to enable Windows EHCont Guard (/guard:ehcont).
302303 if sess. opts . unstable_opts . ehcont_guard {
303- llvm:: LLVMRustAddModuleFlag (
304+ llvm:: LLVMRustAddModuleFlagU32 (
304305 llmod,
305306 llvm:: LLVMModFlagBehavior :: Warning ,
306307 c"ehcontguard" . as_ptr ( ) as * const _ ,
@@ -326,6 +327,23 @@ pub unsafe fn create_module<'ll>(
326327 llvm:: LLVMMDNodeInContext ( llcx, & name_metadata, 1 ) ,
327328 ) ;
328329
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+
329347 // Add module flags specified via -Z llvm_module_flag
330348 for ( key, value, behavior) in & sess. opts . unstable_opts . llvm_module_flag {
331349 let key = format ! ( "{key}\0 " ) ;
@@ -341,7 +359,7 @@ pub unsafe fn create_module<'ll>(
341359 // We already checked this during option parsing
342360 _ => unreachable ! ( ) ,
343361 } ;
344- llvm:: LLVMRustAddModuleFlag ( llmod, behavior, key. as_ptr ( ) . cast ( ) , * value)
362+ llvm:: LLVMRustAddModuleFlagU32 ( llmod, behavior, key. as_ptr ( ) . cast ( ) , * value)
345363 }
346364
347365 llmod
0 commit comments