diff options
| author | Antoni Boucher <bouanto@zoho.com> | 2022-04-13 17:51:39 -0400 |
|---|---|---|
| committer | Antoni Boucher <bouanto@zoho.com> | 2022-04-13 23:01:01 -0400 |
| commit | 4d7de811991aef0484ac0c31fcdfef9a97d91fbb (patch) | |
| tree | 52b4fb9f312967d95e8d772def3a74774bfb2e5f /src | |
| parent | d69ada6bf3b6085bdcf23a7503398424027ee2e0 (diff) | |
| download | rust-4d7de811991aef0484ac0c31fcdfef9a97d91fbb.tar.gz rust-4d7de811991aef0484ac0c31fcdfef9a97d91fbb.zip | |
Add feature for future libgccjit 12 release
Diffstat (limited to 'src')
| -rw-r--r-- | src/builder.rs | 15 | ||||
| -rw-r--r-- | src/intrinsic/llvm.rs | 14 | ||||
| -rw-r--r-- | src/intrinsic/simd.rs | 4 | ||||
| -rw-r--r-- | src/lib.rs | 11 | ||||
| -rw-r--r-- | src/type_.rs | 2 | ||||
| -rw-r--r-- | src/type_of.rs | 2 |
6 files changed, 46 insertions, 2 deletions
diff --git a/src/builder.rs b/src/builder.rs index a4616d8673e..6f24abaea8a 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -301,6 +301,15 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> { result.to_rvalue() } else { + #[cfg(not(feature="master"))] + if gcc_func.get_param_count() == 0 { + // FIXME(antoyo): As a temporary workaround for unsupported LLVM intrinsics. + self.block.add_eval(None, self.cx.context.new_call_through_ptr(None, func_ptr, &[])); + } + else { + self.block.add_eval(None, self.cx.context.new_call_through_ptr(None, func_ptr, &args)); + } + #[cfg(feature="master")] self.block.add_eval(None, self.cx.context.new_call_through_ptr(None, func_ptr, &args)); // Return dummy value when not having return value. let result = current_func.new_local(None, self.isize_type, "dummyValueThatShouldNeverBeUsed"); @@ -1287,6 +1296,7 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> { } impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> { + #[cfg(feature="master")] pub fn shuffle_vector(&mut self, v1: RValue<'gcc>, v2: RValue<'gcc>, mask: RValue<'gcc>) -> RValue<'gcc> { let struct_type = mask.get_type().is_struct().expect("mask of struct type"); @@ -1361,6 +1371,11 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> { result } } + + #[cfg(not(feature="master"))] + pub fn shuffle_vector(&mut self, _v1: RValue<'gcc>, _v2: RValue<'gcc>, _mask: RValue<'gcc>) -> RValue<'gcc> { + unimplemented!(); + } } impl<'a, 'gcc, 'tcx> StaticBuilderMethods for Builder<'a, 'gcc, 'tcx> { diff --git a/src/intrinsic/llvm.rs b/src/intrinsic/llvm.rs index bc8e99428ed..4b41b0ba6e7 100644 --- a/src/intrinsic/llvm.rs +++ b/src/intrinsic/llvm.rs @@ -2,6 +2,20 @@ use gccjit::Function; use crate::context::CodegenCx; +#[cfg(not(feature="master"))] +pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function<'gcc> { + match name { + "llvm.x86.xgetbv" => { + let gcc_name = "__builtin_trap"; + let func = cx.context.get_builtin_function(gcc_name); + cx.functions.borrow_mut().insert(gcc_name.to_string(), func); + return func; + }, + _ => unimplemented!("unsupported LLVM intrinsic {}", name), + } +} + +#[cfg(feature="master")] pub fn intrinsic<'gcc, 'tcx>(name: &str, cx: &CodegenCx<'gcc, 'tcx>) -> Function<'gcc> { let gcc_name = match name { "llvm.x86.xgetbv" => "__builtin_ia32_xgetbv", diff --git a/src/intrinsic/simd.rs b/src/intrinsic/simd.rs index b8c6038896d..f1167bc3a3b 100644 --- a/src/intrinsic/simd.rs +++ b/src/intrinsic/simd.rs @@ -154,6 +154,7 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(bx: &mut Builder<'a, 'gcc, 'tcx>, )); } + #[cfg(feature="master")] if name == sym::simd_insert { require!( in_elem == arg_tys[2], @@ -213,6 +214,8 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(bx: &mut Builder<'a, 'gcc, 'tcx>, // TODO(antoyo): perhaps use __builtin_convertvector for vector casting. return Ok(bx.context.new_bitcast(None, result, vector.get_type())); } + + #[cfg(feature="master")] if name == sym::simd_extract { require!( ret_ty == in_elem, @@ -503,6 +506,7 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(bx: &mut Builder<'a, 'gcc, 'tcx>, simd_neg: Int => neg, Float => fneg; } + #[cfg(feature="master")] if name == sym::simd_saturating_add || name == sym::simd_saturating_sub { let lhs = args[0].immediate(); let rhs = args[1].immediate(); diff --git a/src/lib.rs b/src/lib.rs index a8029f0425a..31d3a5ab299 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -299,10 +299,17 @@ pub fn target_features(sess: &Session) -> Vec<Symbol> { if sess.is_nightly_build() || gate.is_none() { Some(feature) } else { None } }, ) - .filter(|feature| { + .filter(|_feature| { // TODO(antoyo): implement a way to get enabled feature in libgccjit. // Probably using the equivalent of __builtin_cpu_supports. - feature.contains("sse") || feature.contains("avx") + #[cfg(feature="master")] + { + _feature.contains("sse") || _feature.contains("avx") + } + #[cfg(not(feature="master"))] + { + false + } /* adx, aes, avx, avx2, avx512bf16, avx512bitalg, avx512bw, avx512cd, avx512dq, avx512er, avx512f, avx512gfni, avx512ifma, avx512pf, avx512vaes, avx512vbmi, avx512vbmi2, avx512vl, avx512vnni, avx512vp2intersect, avx512vpclmulqdq, diff --git a/src/type_.rs b/src/type_.rs index d65649ecfa3..db2b5ea8ab2 100644 --- a/src/type_.rs +++ b/src/type_.rs @@ -125,6 +125,7 @@ impl<'gcc, 'tcx> BaseTypeMethods<'tcx> for CodegenCx<'gcc, 'tcx> { .collect(); let typ = self.context.new_struct_type(None, "struct", &fields).as_type(); if packed { + #[cfg(feature="master")] typ.set_packed(); } self.struct_types.borrow_mut().insert(types, typ); @@ -217,6 +218,7 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> { .collect(); typ.set_fields(None, &fields); if packed { + #[cfg(feature="master")] typ.as_type().set_packed(); } } diff --git a/src/type_of.rs b/src/type_of.rs index c6d6f91a742..adcae9c16c3 100644 --- a/src/type_of.rs +++ b/src/type_of.rs @@ -25,6 +25,7 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> { } } + #[cfg(feature="master")] pub fn type_int_from_ty(&self, t: ty::IntTy) -> Type<'gcc> { match t { ty::IntTy::Isize => self.type_isize(), @@ -36,6 +37,7 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> { } } + #[cfg(feature="master")] pub fn type_uint_from_ty(&self, t: ty::UintTy) -> Type<'gcc> { match t { ty::UintTy::Usize => self.type_isize(), |
