commit
ce73bab440
3 changed files with 9 additions and 50 deletions
|
@ -538,11 +538,6 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
|
|||
}
|
||||
|
||||
fn ret(&mut self, mut value: RValue<'gcc>) {
|
||||
if self.structs_as_pointer.borrow().contains(&value) {
|
||||
// NOTE: hack to workaround a limitation of the rustc API: see comment on
|
||||
// CodegenCx.structs_as_pointer
|
||||
value = value.dereference(self.location).to_rvalue();
|
||||
}
|
||||
let expected_return_type = self.current_func().get_return_type();
|
||||
if !expected_return_type.is_compatible_with(value.get_type()) {
|
||||
// NOTE: due to opaque pointers now being used, we need to cast here.
|
||||
|
@ -1119,13 +1114,7 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
|
|||
// TODO(antoyo)
|
||||
}
|
||||
|
||||
fn store(&mut self, mut val: RValue<'gcc>, ptr: RValue<'gcc>, align: Align) -> RValue<'gcc> {
|
||||
if self.structs_as_pointer.borrow().contains(&val) {
|
||||
// NOTE: hack to workaround a limitation of the rustc API: see comment on
|
||||
// CodegenCx.structs_as_pointer
|
||||
val = val.dereference(self.location).to_rvalue();
|
||||
}
|
||||
|
||||
fn store(&mut self, val: RValue<'gcc>, ptr: RValue<'gcc>, align: Align) -> RValue<'gcc> {
|
||||
self.store_with_flags(val, ptr, align, MemFlags::empty())
|
||||
}
|
||||
|
||||
|
@ -1508,16 +1497,6 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
|
|||
element.get_address(self.location)
|
||||
} else if value_type.dyncast_vector().is_some() {
|
||||
panic!();
|
||||
} else if let Some(pointer_type) = value_type.get_pointee() {
|
||||
if let Some(struct_type) = pointer_type.is_struct() {
|
||||
// NOTE: hack to workaround a limitation of the rustc API: see comment on
|
||||
// CodegenCx.structs_as_pointer
|
||||
aggregate_value
|
||||
.dereference_field(self.location, struct_type.get_field(idx as i32))
|
||||
.to_rvalue()
|
||||
} else {
|
||||
panic!("Unexpected type {:?}", value_type);
|
||||
}
|
||||
} else if let Some(struct_type) = value_type.is_struct() {
|
||||
aggregate_value
|
||||
.access_field(self.location, struct_type.get_field(idx as i32))
|
||||
|
@ -1537,21 +1516,18 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
|
|||
assert_eq!(idx as usize as u64, idx);
|
||||
let value_type = aggregate_value.get_type();
|
||||
|
||||
let new_val = self.current_func().new_local(None, value_type, "aggregate_value");
|
||||
self.block.add_assignment(None, new_val, aggregate_value);
|
||||
|
||||
let lvalue = if value_type.dyncast_array().is_some() {
|
||||
let index = self
|
||||
.context
|
||||
.new_rvalue_from_long(self.u64_type, i64::try_from(idx).expect("i64::try_from"));
|
||||
self.context.new_array_access(self.location, aggregate_value, index)
|
||||
self.context.new_array_access(self.location, new_val, index)
|
||||
} else if value_type.dyncast_vector().is_some() {
|
||||
panic!();
|
||||
} else if let Some(pointer_type) = value_type.get_pointee() {
|
||||
if let Some(struct_type) = pointer_type.is_struct() {
|
||||
// NOTE: hack to workaround a limitation of the rustc API: see comment on
|
||||
// CodegenCx.structs_as_pointer
|
||||
aggregate_value.dereference_field(self.location, struct_type.get_field(idx as i32))
|
||||
} else {
|
||||
panic!("Unexpected type {:?}", value_type);
|
||||
}
|
||||
} else if let Some(struct_type) = value_type.is_struct() {
|
||||
new_val.access_field(None, struct_type.get_field(idx as i32))
|
||||
} else {
|
||||
panic!("Unexpected type {:?}", value_type);
|
||||
};
|
||||
|
@ -1568,7 +1544,7 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
|
|||
|
||||
self.llbb().add_assignment(self.location, lvalue, value);
|
||||
|
||||
aggregate_value
|
||||
new_val.to_rvalue()
|
||||
}
|
||||
|
||||
fn set_personality_fn(&mut self, _personality: Function<'gcc>) {
|
||||
|
|
|
@ -117,15 +117,7 @@ impl<'gcc, 'tcx> ConstCodegenMethods for CodegenCx<'gcc, 'tcx> {
|
|||
|
||||
fn const_undef(&self, typ: Type<'gcc>) -> RValue<'gcc> {
|
||||
let local = self.current_func.borrow().expect("func").new_local(None, typ, "undefined");
|
||||
if typ.is_struct().is_some() {
|
||||
// NOTE: hack to workaround a limitation of the rustc API: see comment on
|
||||
// CodegenCx.structs_as_pointer
|
||||
let pointer = local.get_address(None);
|
||||
self.structs_as_pointer.borrow_mut().insert(pointer);
|
||||
pointer
|
||||
} else {
|
||||
local.to_rvalue()
|
||||
}
|
||||
local.to_rvalue()
|
||||
}
|
||||
|
||||
fn const_poison(&self, typ: Type<'gcc>) -> RValue<'gcc> {
|
||||
|
|
|
@ -124,14 +124,6 @@ pub struct CodegenCx<'gcc, 'tcx> {
|
|||
|
||||
pub pointee_infos: RefCell<FxHashMap<(Ty<'tcx>, Size), Option<PointeeInfo>>>,
|
||||
|
||||
/// NOTE: a hack is used because the rustc API is not suitable to libgccjit and as such,
|
||||
/// `const_undef()` returns struct as pointer so that they can later be assigned a value (in
|
||||
/// e.g. Builder::insert_value).
|
||||
/// As such, this set remembers which of these pointers were returned by this function so that
|
||||
/// they can be dereferenced later.
|
||||
/// FIXME(antoyo): fix the rustc API to avoid having this hack.
|
||||
pub structs_as_pointer: RefCell<FxHashSet<RValue<'gcc>>>,
|
||||
|
||||
#[cfg(feature = "master")]
|
||||
pub cleanup_blocks: RefCell<FxHashSet<Block<'gcc>>>,
|
||||
/// The alignment of a u128/i128 type.
|
||||
|
@ -304,7 +296,6 @@ impl<'gcc, 'tcx> CodegenCx<'gcc, 'tcx> {
|
|||
#[cfg(feature = "master")]
|
||||
rust_try_fn: Cell::new(None),
|
||||
pointee_infos: Default::default(),
|
||||
structs_as_pointer: Default::default(),
|
||||
#[cfg(feature = "master")]
|
||||
cleanup_blocks: Default::default(),
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue