@@ -8,6 +8,8 @@ use crate::type_of::LayoutLlvmExt;
88use crate :: va_arg:: emit_va_arg;
99use crate :: value:: Value ;
1010
11+ use libc:: c_char;
12+
1113use rustc_ast:: ast;
1214use rustc_codegen_ssa:: base:: { compare_simd_types, to_immediate, wants_msvc_seh} ;
1315use rustc_codegen_ssa:: common:: span_invalid_monomorphization_error;
@@ -25,6 +27,7 @@ use rustc_span::Span;
2527use rustc_target:: abi:: { self , HasDataLayout , LayoutOf , Primitive } ;
2628
2729use std:: cmp:: Ordering ;
30+ use std:: ffi:: CStr ;
2831use std:: { i128, iter, u128} ;
2932
3033fn 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
7881 Some ( cx. get_intrinsic ( & llvm_name) )
7982}
8083
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+
8187impl IntrinsicCallMethods < ' tcx > for Builder < ' a , ' ll , ' tcx > {
8288 fn codegen_intrinsic_call (
8389 & mut self ,
@@ -747,6 +753,26 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
747753 // this is where the signed magic happens (notice the `s` in `exactsdiv`)
748754 self . exactsdiv ( d, pointee_size)
749755 }
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+ }
750776
751777 _ => bug ! ( "unknown intrinsic '{}'" , name) ,
752778 } ;
0 commit comments