Skip to content

Commit

Permalink
Merge pull request #233 from baszalmstra/fix/issue_227
Browse files Browse the repository at this point in the history
fix: fixes a lot of llvm assertions
  • Loading branch information
baszalmstra authored Jun 23, 2020
2 parents e2a25f2 + c173381 commit 72d2dd8
Show file tree
Hide file tree
Showing 134 changed files with 363 additions and 316 deletions.
1 change: 1 addition & 0 deletions crates/mun_codegen/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ array-init="0.1.0"
tempfile = "3"
paste = "0.1.6"
parking_lot = "0.10"
by_address = "1.0"

[dependencies.inkwell]
git = "https://github.com/mun-lang/inkwell"
Expand Down
15 changes: 14 additions & 1 deletion crates/mun_codegen/src/code_gen.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use crate::code_gen::linker::LinkerError;
use crate::db::StructMapping;
use crate::value::{IrTypeContext, IrValueContext};
use crate::IrDatabase;
use hir::{FileId, RelativePathBuf};
Expand All @@ -10,6 +11,8 @@ use inkwell::{
OptimizationLevel,
};
use mun_target::spec;
use parking_lot::RwLock;
use std::collections::HashMap;
use std::io::{self, Write};
use std::{
path::{Path, PathBuf},
Expand Down Expand Up @@ -152,10 +155,11 @@ impl<'a, D: IrDatabase> ModuleBuilder<'a, D> {
.map_err(|e| CodeGenerationError::ModuleLinkerError(e.to_string()))?;

let target_data = self.db.target_data();
let struct_types = self.db.type_to_struct_mapping();
let type_context = IrTypeContext {
context: &self.assembly_module.get_context(),
target_data: target_data.as_ref(),
struct_types: Default::default(),
struct_types: struct_types.as_ref(),
};

let value_context = IrValueContext {
Expand Down Expand Up @@ -218,3 +222,12 @@ fn optimize_module(module: &Module, optimization_lvl: OptimizationLevel) {
pub(crate) fn target_data_query(db: &impl IrDatabase) -> Arc<TargetData> {
Arc::new(TargetData::create(&db.target().data_layout))
}

/// Returns a mapping from struct type to a struct type in the context. This is a query because the
/// value of struct type depends on the target we compile for.
pub(crate) fn type_to_struct_mapping_query(
db: &impl IrDatabase,
) -> by_address::ByAddress<Arc<StructMapping>> {
let _ = db.target_data();
by_address::ByAddress(Arc::new(RwLock::new(HashMap::default())))
}
18 changes: 9 additions & 9 deletions crates/mun_codegen/src/code_gen/symbols.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,8 @@ fn gen_prototype_from_function<D: IrDatabase>(
.params()
.iter()
.map(|ty| {
TypeTable::get(module, &db.type_info(ty.clone()))
TypeTable::get(module, &db.type_info(ty.clone()), context)
.expect("expected a TypeInfo for a prototype argument but it was not found")
.as_value(context)
})
.into_const_private_pointer_or_null(format!("fn_sig::<{}>::arg_types", &name), context);

Expand Down Expand Up @@ -76,9 +75,8 @@ fn gen_prototype_from_dispatch_entry(
.arg_types
.iter()
.map(|type_info| {
TypeTable::get(module, type_info)
TypeTable::get(module, type_info, context)
.expect("expected a TypeInfo for a prototype argument but it was not found")
.as_value(context)
})
.into_const_private_pointer_or_null(
format!("{}_param_types", function.prototype.name),
Expand Down Expand Up @@ -120,9 +118,8 @@ fn gen_signature_return_type_from_type_info(
) -> Value<*const ir::TypeInfo> {
ret_type
.map(|info| {
TypeTable::get(context.module, &info)
TypeTable::get(context.module, &info, context)
.expect("could not find TypeInfo that should definitely be there")
.as_value(context)
})
.unwrap_or_else(|| Value::null(context))
}
Expand Down Expand Up @@ -152,7 +149,10 @@ fn get_function_definition_array<'a, D: IrDatabase>(
let prototype = gen_prototype_from_function(db, context, *f);
ir::FunctionDefinition {
prototype,
fn_ptr: Value::from_raw(value.as_global_value().as_pointer_value()),
fn_ptr: Value::<*const fn()>::with_cast(
value.as_global_value().as_pointer_value(),
context,
),
}
})
.as_value(context)
Expand Down Expand Up @@ -184,7 +184,7 @@ fn gen_dispatch_table(
// dispatch table was created. Because of this we have to lookup the dispatch table
// global again. There is however not a `GlobalValue::get_name` method so I just
// hardcoded the name here.
Value::from_raw(module.get_global("dispatchTable").unwrap().as_pointer_value()))
Value::<*mut *const fn()>::with_cast(module.get_global("dispatchTable").unwrap().as_pointer_value(), context))
.unwrap_or_else(|| Value::null(context));

ir::DispatchTable {
Expand Down Expand Up @@ -272,7 +272,7 @@ fn gen_get_info_fn(
inkwell::attributes::AttributeLoc::Param(0),
context
.context
.create_enum_attribute(Attribute::get_named_enum_kind_id("sret"), 1),
.create_enum_attribute(Attribute::get_named_enum_kind_id("sret"), 0),
);
}

Expand Down
13 changes: 13 additions & 0 deletions crates/mun_codegen/src/db.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,19 @@ use crate::{
type_info::TypeInfo,
CodeGenParams, Context,
};
use by_address::ByAddress;
use inkwell::{
targets::TargetData,
types::{AnyTypeEnum, StructType},
OptimizationLevel,
};
use parking_lot::RwLock;
use std::any::TypeId;
use std::collections::HashMap;
use std::sync::Arc;

pub type StructMapping = RwLock<HashMap<(&'static str, TypeId), StructType>>;

/// The `IrDatabase` enables caching of intermediate in the process of LLVM IR generation. It uses
/// [salsa](https://github.com/salsa-rs/salsa) for this purpose.
#[salsa::query_group(IrDatabaseStorage)]
Expand All @@ -28,6 +34,13 @@ pub trait IrDatabase: hir::HirDatabase {
#[salsa::invoke(crate::code_gen::target_data_query)]
fn target_data(&self) -> Arc<TargetData>;

/// Returns a mapping from type to a struct value. This is essentially a cache value which is
/// a bit strange to store in the database since its mutable. However, multiple queries need
/// to synchronize with this so that is why we store it here nonetheless. Also the mapping
/// should be invalidated if the `target_data` changes.
#[salsa::invoke(crate::code_gen::type_to_struct_mapping_query)]
fn type_to_struct_mapping(&self) -> ByAddress<Arc<StructMapping>>;

/// Given a type and code generation parameters, return the corresponding IR type.
#[salsa::invoke(crate::ir::ty::ir_query)]
fn type_ir(&self, ty: hir::Ty, params: CodeGenParams) -> AnyTypeEnum;
Expand Down
4 changes: 3 additions & 1 deletion crates/mun_codegen/src/ir/file_group.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,12 @@ pub(crate) fn ir_query(db: &impl IrDatabase, file_id: hir::FileId) -> Arc<FileGr

let dispatch_table = dispatch_table_builder.build();

let struct_types = db.type_to_struct_mapping();

let type_context = IrTypeContext {
context: &db.context(),
target_data: &db.target_data(),
struct_types: Default::default(),
struct_types: struct_types.as_ref(),
};
let value_context = IrValueContext {
type_context: &type_context,
Expand Down
39 changes: 22 additions & 17 deletions crates/mun_codegen/src/ir/type_table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,14 @@ impl TypeTable {
}

/// Retrieves the global `TypeInfo` IR value corresponding to `type_info`, if it exists.
pub fn get(module: &Module, type_info: &TypeInfo) -> Option<Global<ir::TypeInfo>> {
pub fn get(
module: &Module,
type_info: &TypeInfo,
context: &IrValueContext,
) -> Option<Value<*const ir::TypeInfo>> {
module
.get_global(&type_info_global_name(type_info))
.map(|g| unsafe { Global::from_raw(g) })
.map(|g| Value::<*const ir::TypeInfo>::with_cast(g.as_pointer_value(), context))
}

/// Returns the number of types in the `TypeTable`.
Expand Down Expand Up @@ -175,12 +179,12 @@ impl<'a, 'ctx, 'm, D: IrDatabase> TypeTableBuilder<'a, 'ctx, 'm, D> {

fn gen_type_info(
&self,
type_info_to_ir: &mut HashMap<TypeInfo, Global<ir::TypeInfo>>,
type_info_to_ir: &mut HashMap<TypeInfo, Value<*const ir::TypeInfo>>,
type_info: &TypeInfo,
) -> Global<ir::TypeInfo> {
) -> Value<*const ir::TypeInfo> {
// If there is already an entry, return that.
if let Some(global) = type_info_to_ir.get(type_info) {
return *global;
if let Some(value) = type_info_to_ir.get(type_info) {
return *value;
}

// Construct the header part of the abi::TypeInfo
Expand Down Expand Up @@ -209,31 +213,33 @@ impl<'a, 'ctx, 'm, D: IrDatabase> TypeTableBuilder<'a, 'ctx, 'm, D> {

// Build the global value for the ir::TypeInfo
let type_ir_name = type_info_global_name(type_info);
let global = match type_info.group {
TypeGroup::FundamentalTypes => {
type_info_ir.into_const_private_global(&type_ir_name, self.value_context)
}
let value = match type_info.group {
TypeGroup::FundamentalTypes => type_info_ir
.into_const_private_global(&type_ir_name, self.value_context)
.as_value(self.value_context),
TypeGroup::StructTypes(s) => {
// In case of a struct the `Global<ir::TypeInfo>` is actually a
// `Global<(ir::TypeInfo, ir::StructInfo)>`. We mask this value which is unsafe
// but correct from an ABI perspective.
// `Global<(ir::TypeInfo, ir::StructInfo)>`.
let struct_info_ir = self.gen_struct_info(type_info_to_ir, s);
let compound_type_ir = (type_info_ir, struct_info_ir).as_value(self.value_context);
let compound_global =
compound_type_ir.into_const_private_global(&type_ir_name, self.value_context);
unsafe { Global::from_raw(compound_global.value) }
Value::<*const ir::TypeInfo>::with_cast(
compound_global.value.as_pointer_value(),
self.value_context,
)
}
};

// Insert the value in this case, so we don't recompute and generate multiple values.
type_info_to_ir.insert(type_info.clone(), global);
type_info_to_ir.insert(type_info.clone(), value);

global
value
}

fn gen_struct_info(
&self,
type_info_to_ir: &mut HashMap<TypeInfo, Global<ir::TypeInfo>>,
type_info_to_ir: &mut HashMap<TypeInfo, Value<*const ir::TypeInfo>>,
hir_struct: hir::Struct,
) -> Value<ir::StructInfo> {
let struct_ir = self.db.struct_ty(hir_struct);
Expand Down Expand Up @@ -264,7 +270,6 @@ impl<'a, 'ctx, 'm, D: IrDatabase> TypeTableBuilder<'a, 'ctx, 'm, D> {
.map(|field| {
let field_type_info = self.db.type_info(field.ty(self.db));
self.gen_type_info(type_info_to_ir, &field_type_info)
.as_value(self.value_context)
})
.into_const_private_pointer_or_null(
format!("struct_info::<{}>::field_types", name),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::f32>::name" = private unnamed_addr constant [10 x i8] c"core::f32\00"
@"type_info::<core::f32>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"P\19b7\A8k\F2\81P\FB\83\F5P\B0\82!", [10 x i8]* @"type_info::<core::f32>::name", i32 32, i8 4, i8 0 }
@"type_info::<core::f32>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"P\19b7\A8k\F2\81P\FB\83\F5P\B0\82!", i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"type_info::<core::f32>::name", i32 0, i32 0), i32 32, i8 4, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::f32>"]

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::f64>::name" = private unnamed_addr constant [10 x i8] c"core::f64\00"
@"type_info::<core::f64>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"`\DBF\9C?YJ%G\AD4\9F\D5\92%A", [10 x i8]* @"type_info::<core::f64>::name", i32 64, i8 8, i8 0 }
@"type_info::<core::f64>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"`\DBF\9C?YJ%G\AD4\9F\D5\92%A", i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"type_info::<core::f64>::name", i32 0, i32 0), i32 64, i8 8, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::f64>"]

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::i128>::name" = private unnamed_addr constant [11 x i8] c"core::i128\00"
@"type_info::<core::i128>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\BDkp\09RRM\EBc\02\A0\DB47\A7\E3", [11 x i8]* @"type_info::<core::i128>::name", i32 128, i8 8, i8 0 }
@"type_info::<core::i128>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\BDkp\09RRM\EBc\02\A0\DB47\A7\E3", i8* getelementptr inbounds ([11 x i8], [11 x i8]* @"type_info::<core::i128>::name", i32 0, i32 0), i32 128, i8 8, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::i128>"]

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::i16>::name" = private unnamed_addr constant [10 x i8] c"core::i16\00"
@"type_info::<core::i16>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\05\CD|\F8Bv\D8\B1\E8\8B\8C\D8\8D\B5\89\B0", [10 x i8]* @"type_info::<core::i16>::name", i32 16, i8 2, i8 0 }
@"type_info::<core::i16>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\05\CD|\F8Bv\D8\B1\E8\8B\8C\D8\8D\B5\89\B0", i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"type_info::<core::i16>::name", i32 0, i32 0), i32 16, i8 2, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::i16>"]

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::i32>::name" = private unnamed_addr constant [10 x i8] c"core::i32\00"
@"type_info::<core::i32>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\17yzt\19\D62\17\D25\95C\17\88[\FA", [10 x i8]* @"type_info::<core::i32>::name", i32 32, i8 4, i8 0 }
@"type_info::<core::i32>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\17yzt\19\D62\17\D25\95C\17\88[\FA", i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"type_info::<core::i32>::name", i32 0, i32 0), i32 32, i8 4, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::i32>"]

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::i64>::name" = private unnamed_addr constant [10 x i8] c"core::i64\00"
@"type_info::<core::i64>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"G\13;t\97j8\18\D7M\83`\1D\C8\19%", [10 x i8]* @"type_info::<core::i64>::name", i32 64, i8 8, i8 0 }
@"type_info::<core::i64>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"G\13;t\97j8\18\D7M\83`\1D\C8\19%", i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"type_info::<core::i64>::name", i32 0, i32 0), i32 64, i8 8, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::i64>"]

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::i8>::name" = private unnamed_addr constant [9 x i8] c"core::i8\00"
@"type_info::<core::i8>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\EF\C4\B1Z\E7\12\B1\91q\F1\0B\80U\FC\A6\0F", [9 x i8]* @"type_info::<core::i8>::name", i32 8, i8 1, i8 0 }
@"type_info::<core::i8>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\EF\C4\B1Z\E7\12\B1\91q\F1\0B\80U\FC\A6\0F", i8* getelementptr inbounds ([9 x i8], [9 x i8]* @"type_info::<core::i8>::name", i32 0, i32 0), i32 8, i8 1, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::i8>"]

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::u128>::name" = private unnamed_addr constant [11 x i8] c"core::u128\00"
@"type_info::<core::u128>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\E67\1BU\E9k\95\93d\14}\1C\96S\95\F0", [11 x i8]* @"type_info::<core::u128>::name", i32 128, i8 8, i8 0 }
@"type_info::<core::u128>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\E67\1BU\E9k\95\93d\14}\1C\96S\95\F0", i8* getelementptr inbounds ([11 x i8], [11 x i8]* @"type_info::<core::u128>::name", i32 0, i32 0), i32 128, i8 8, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::u128>"]

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::u16>::name" = private unnamed_addr constant [10 x i8] c"core::u16\00"
@"type_info::<core::u16>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"0\01\BC\BBK\E0\F2\7F&l\01\CD|q\F2\B3", [10 x i8]* @"type_info::<core::u16>::name", i32 16, i8 2, i8 0 }
@"type_info::<core::u16>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"0\01\BC\BBK\E0\F2\7F&l\01\CD|q\F2\B3", i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"type_info::<core::u16>::name", i32 0, i32 0), i32 16, i8 2, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::u16>"]

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::u32>::name" = private unnamed_addr constant [10 x i8] c"core::u32\00"
@"type_info::<core::u32>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"daz5d\A6\BE\88\81=&Y\A1+\C6\1D", [10 x i8]* @"type_info::<core::u32>::name", i32 32, i8 4, i8 0 }
@"type_info::<core::u32>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"daz5d\A6\BE\88\81=&Y\A1+\C6\1D", i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"type_info::<core::u32>::name", i32 0, i32 0), i32 32, i8 4, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::u32>"]

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::u64>::name" = private unnamed_addr constant [10 x i8] c"core::u64\00"
@"type_info::<core::u64>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\A6\E7g \D1\8B\1Aq`\1F\1E\07\BB5@q", [10 x i8]* @"type_info::<core::u64>::name", i32 64, i8 8, i8 0 }
@"type_info::<core::u64>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\A6\E7g \D1\8B\1Aq`\1F\1E\07\BB5@q", i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"type_info::<core::u64>::name", i32 0, i32 0), i32 64, i8 8, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::u64>"]

Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::u8>::name" = private unnamed_addr constant [9 x i8] c"core::u8\00"
@"type_info::<core::u8>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\A0y\A7S\B6(n\F7f&H\E1\F9\AD\04>", [9 x i8]* @"type_info::<core::u8>::name", i32 8, i8 1, i8 0 }
@"type_info::<core::u8>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"\A0y\A7S\B6(n\F7f&H\E1\F9\AD\04>", i8* getelementptr inbounds ([9 x i8], [9 x i8]* @"type_info::<core::u8>::name", i32 0, i32 0), i32 8, i8 1, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::u8>"]

Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ source_filename = "group_name"
%struct.MunTypeInfo = type { [16 x i8], i8*, i32, i8, i8 }

@"type_info::<core::bool>::name" = private unnamed_addr constant [11 x i8] c"core::bool\00"
@"type_info::<core::bool>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"x\82\81m t7\03\CB\F8k\81-;\C9\84", [11 x i8]* @"type_info::<core::bool>::name", i32 1, i8 1, i8 0 }
@"type_info::<core::bool>" = private unnamed_addr constant %struct.MunTypeInfo { [16 x i8] c"x\82\81m t7\03\CB\F8k\81-;\C9\84", i8* getelementptr inbounds ([11 x i8], [11 x i8]* @"type_info::<core::bool>::name", i32 0, i32 0), i32 1, i8 1, i8 0 }
@global_type_table = constant [1 x %struct.MunTypeInfo*] [%struct.MunTypeInfo* @"type_info::<core::bool>"]

Loading

0 comments on commit 72d2dd8

Please sign in to comment.