@@ -8,6 +8,8 @@ use crate::type_of::LayoutLlvmExt;
8
8
use crate :: va_arg:: emit_va_arg;
9
9
use crate :: value:: Value ;
10
10
11
+ use libc:: c_char;
12
+
11
13
use rustc_ast:: ast;
12
14
use rustc_codegen_ssa:: base:: { compare_simd_types, to_immediate, wants_msvc_seh} ;
13
15
use rustc_codegen_ssa:: common:: span_invalid_monomorphization_error;
@@ -25,6 +27,7 @@ use rustc_span::Span;
25
27
use rustc_target:: abi:: { self , HasDataLayout , LayoutOf , Primitive } ;
26
28
27
29
use std:: cmp:: Ordering ;
30
+ use std:: ffi:: CStr ;
28
31
use std:: { i128, iter, u128} ;
29
32
30
33
fn get_simple_intrinsic ( cx : & CodegenCx < ' ll , ' _ > , name : & str ) -> Option < & ' ll Value > {
@@ -78,6 +81,9 @@ fn get_simple_intrinsic(cx: &CodegenCx<'ll, '_>, name: &str) -> Option<&'ll Valu
78
81
Some ( cx. get_intrinsic ( & llvm_name) )
79
82
}
80
83
84
+ const EMPTY_C_STR : & CStr = unsafe { CStr :: from_bytes_with_nul_unchecked ( b"\0 " ) } ;
85
+ const UNNAMED : * const c_char = EMPTY_C_STR . as_ptr ( ) ;
86
+
81
87
impl IntrinsicCallMethods < ' tcx > for Builder < ' a , ' ll , ' tcx > {
82
88
fn codegen_intrinsic_call (
83
89
& mut self ,
@@ -747,6 +753,26 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
747
753
// this is where the signed magic happens (notice the `s` in `exactsdiv`)
748
754
self . exactsdiv ( d, pointee_size)
749
755
}
756
+ "amdgcn_dispatch_ptr" => {
757
+ // This intrinsic returns a pointer in the const addr space
758
+ // which can't be encoded in source level Rust.
759
+
760
+ let f = self . cx ( ) . get_intrinsic ( "llvm.amdgcn.dispatch.ptr" ) ;
761
+ let val = self . call ( f, & [ ] , None ) ;
762
+ // XXX Needs the proper address space patch
763
+ unsafe { llvm:: LLVMBuildAddrSpaceCast ( self . llbuilder , val,
764
+ llret_ty, UNNAMED ) }
765
+ }
766
+ "amdgcn_queue_ptr" => {
767
+ // This intrinsic returns a pointer in the const addr space
768
+ // which can't be encoded in source level Rust.
769
+
770
+ let f = self . cx ( ) . get_intrinsic ( "llvm.amdgcn.queue.ptr" ) ;
771
+ let val = self . call ( f, & [ ] , None ) ;
772
+ // XXX Needs the proper address space patch
773
+ unsafe { llvm:: LLVMBuildAddrSpaceCast ( self . llbuilder , val,
774
+ llret_ty, UNNAMED ) }
775
+ }
750
776
751
777
_ => bug ! ( "unknown intrinsic '{}'" , name) ,
752
778
} ;
0 commit comments