Skip to content

Commit 3dbdb3a

Browse files
author
James Miller
committed
Methodize TypeNames
1 parent 544f615 commit 3dbdb3a

File tree

2 files changed

+69
-107
lines changed

2 files changed

+69
-107
lines changed

src/librustc/lib/llvm.rs

Lines changed: 64 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -2121,121 +2121,81 @@ pub fn ConstFCmp(Pred: RealPredicate, V1: ValueRef, V2: ValueRef) -> ValueRef {
21212121
/* Memory-managed object interface to type handles. */
21222122

21232123
pub struct TypeNames {
2124-
type_names: @mut HashMap<TypeRef, @str>,
2125-
named_types: @mut HashMap<@str, TypeRef>
2124+
type_names: HashMap<TypeRef, @str>,
2125+
named_types: HashMap<@str, TypeRef>
21262126
}
21272127

2128-
pub fn associate_type(tn: @TypeNames, s: @str, t: TypeRef) {
2129-
assert!(tn.type_names.insert(t, s));
2130-
assert!(tn.named_types.insert(s, t));
2131-
}
2132-
2133-
pub fn type_has_name(tn: @TypeNames, t: TypeRef) -> Option<@str> {
2134-
return tn.type_names.find(&t).map_consume(|x| *x);
2135-
}
2136-
2137-
pub fn name_has_type(tn: @TypeNames, s: @str) -> Option<TypeRef> {
2138-
return tn.named_types.find(&s).map_consume(|x| *x);
2139-
}
2140-
2141-
pub fn mk_type_names() -> @TypeNames {
2142-
@TypeNames {
2143-
type_names: @mut HashMap::new(),
2144-
named_types: @mut HashMap::new()
2128+
impl TypeNames {
2129+
pub fn new() -> TypeNames {
2130+
TypeNames {
2131+
type_names: HashMap::new(),
2132+
named_types: HashMap::new()
2133+
}
21452134
}
2146-
}
2147-
2148-
pub fn type_to_str(names: @TypeNames, ty: TypeRef) -> @str {
2149-
return type_to_str_inner(names, [], ty);
2150-
}
21512135

2152-
pub fn type_to_str_inner(names: @TypeNames, outer0: &[TypeRef], ty: TypeRef)
2153-
-> @str {
2154-
unsafe {
2155-
match type_has_name(names, ty) {
2156-
option::Some(n) => return n,
2157-
_ => {}
2158-
}
2136+
pub fn associate_type(&mut self, s: @str, t: TypeRef) {
2137+
assert!(self.type_names.insert(t, s));
2138+
assert!(self.named_types.insert(s, t));
2139+
}
21592140

2160-
let outer = vec::append_one(outer0.to_owned(), ty);
2141+
pub fn find_name(&self, ty: &TypeRef) -> Option<@str> {
2142+
self.type_names.find_copy(ty)
2143+
}
21612144

2162-
let kind = llvm::LLVMGetTypeKind(ty);
2145+
pub fn find_type(&self, s: &str) -> Option<TypeRef> {
2146+
self.named_types.find_equiv(s).map_consume(|x| *x)
2147+
}
21632148

2164-
fn tys_str(names: @TypeNames, outer: &[TypeRef],
2165-
tys: ~[TypeRef]) -> @str {
2166-
let mut s = ~"";
2167-
let mut first: bool = true;
2168-
for tys.each |t| {
2169-
if first { first = false; } else { s += ", "; }
2170-
s += type_to_str_inner(names, outer, *t);
2171-
}
2172-
// [Note at-str] FIXME #2543: Could rewrite this without the copy,
2173-
// but need better @str support.
2174-
return s.to_managed();
2149+
pub fn type_to_str(&self, ty: TypeRef) -> ~str {
2150+
match self.find_name(&ty) {
2151+
option::Some(name) => return name.to_owned(),
2152+
None => ()
21752153
}
21762154

2177-
match kind {
2178-
Void => return @"Void",
2179-
Half => return @"Half",
2180-
Float => return @"Float",
2181-
Double => return @"Double",
2182-
X86_FP80 => return @"X86_FP80",
2183-
FP128 => return @"FP128",
2184-
PPC_FP128 => return @"PPC_FP128",
2185-
Label => return @"Label",
2186-
Integer => {
2187-
// See [Note at-str]
2188-
return fmt!("i%d", llvm::LLVMGetIntTypeWidth(ty)
2189-
as int).to_managed();
2190-
}
2191-
Function => {
2192-
let out_ty: TypeRef = llvm::LLVMGetReturnType(ty);
2193-
let n_args = llvm::LLVMCountParamTypes(ty) as uint;
2194-
let args = vec::from_elem(n_args, 0 as TypeRef);
2195-
llvm::LLVMGetParamTypes(ty, vec::raw::to_ptr(args));
2196-
// See [Note at-str]
2197-
return fmt!("fn(%s) -> %s",
2198-
tys_str(names, outer, args),
2199-
type_to_str_inner(names, outer, out_ty)).to_managed();
2200-
}
2201-
Struct => {
2202-
let elts = struct_tys(ty);
2203-
// See [Note at-str]
2204-
return fmt!("{%s}", tys_str(names, outer, elts)).to_managed();
2205-
}
2206-
Array => {
2207-
let el_ty = llvm::LLVMGetElementType(ty);
2208-
// See [Note at-str]
2209-
return fmt!("[%s@ x %u", type_to_str_inner(names, outer, el_ty),
2210-
llvm::LLVMGetArrayLength(ty) as uint).to_managed();
2211-
}
2212-
Pointer => {
2213-
let mut i = 0;
2214-
for outer0.each |tout| {
2215-
i += 1;
2216-
if *tout as int == ty as int {
2217-
let n = outer0.len() - i;
2218-
// See [Note at-str]
2219-
return fmt!("*\\%d", n as int).to_managed();
2155+
unsafe {
2156+
let kind = llvm::LLVMGetTypeKind(ty);
2157+
2158+
match kind {
2159+
Void => ~"Void",
2160+
Half => ~"Half",
2161+
Double => ~"Double",
2162+
X86_FP80 => ~"X86_FP80",
2163+
FP128 => ~"FP128",
2164+
PPC_FP128 => ~"PPC_FP128",
2165+
Label => ~"Label",
2166+
Vector => ~"Vector",
2167+
Metadata => ~"Metadata",
2168+
X86_MMX => ~"X86_MMAX",
2169+
Integer => {
2170+
fmt!("i%d", llvm::LLVMGetIntTypeWidth(ty) as int)
22202171
}
2221-
}
2222-
let addrstr = {
2223-
let addrspace = llvm::LLVMGetPointerAddressSpace(ty) as uint;
2224-
if addrspace == 0 {
2225-
~""
2226-
} else {
2227-
fmt!("addrspace(%u)", addrspace)
2172+
Function => {
2173+
let out_ty = llvm::LLVMGetReturnType(ty);
2174+
let n_args = llvm::LLVMCountParamTypes(ty) as uint;
2175+
let args = vec::from_elem(n_args, 0 as TypeRef);
2176+
llvm::LLVMGetParamTypes(ty, vec::raw::to_ptr(args));
2177+
2178+
let args = args.map(|&ty| self.type_to_str(ty)).connect(", ");
2179+
let out_ty = self.type_to_str(out_ty);
2180+
fmt!("fn(%s) -> %s", args, out_ty)
22282181
}
2229-
};
2230-
// See [Note at-str]
2231-
return fmt!("%s*%s", addrstr, type_to_str_inner(names,
2232-
outer,
2233-
llvm::LLVMGetElementType(ty))).to_managed();
2234-
}
2235-
Vector => return @"Vector",
2236-
Metadata => return @"Metadata",
2237-
X86_MMX => return @"X86_MMAX",
2238-
_ => fail!()
2182+
Struct => {
2183+
let tys = struct_tys(ty);
2184+
let tys = tys.map(|ty| self.type_to_str(ty)).connect(", ");
2185+
fmt!("{%s}", tys)
2186+
}
2187+
Array => {
2188+
let el_ty = llvm::LLVMGetElementType(ty);
2189+
let el_ty = self.type_to_str(el_ty);
2190+
let len = llvm::LLVMGetArrayLength(ty) as uint;
2191+
fmt!("[%s x %u]", el_ty, len)
2192+
}
2193+
Pointer => {
2194+
let el_ty = llvm::LLVMGetElementType(ty);
2195+
let el_ty = self.type_to_str(el_ty);
2196+
fmt!("*%s", el_ty)
2197+
}
2198+
}
22392199
}
22402200
}
22412201
}

src/librustc/middle/trans/context.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ pub struct CrateContext {
4646
llmod: ModuleRef,
4747
llcx: ContextRef,
4848
td: TargetData,
49-
tn: @TypeNames,
49+
tn: TypeNames,
5050
externs: ExternMap,
5151
intrinsics: HashMap<&'static str, ValueRef>,
5252
item_vals: HashMap<ast::node_id, ValueRef>,
@@ -136,16 +136,18 @@ impl CrateContext {
136136
str::as_c_str(data_layout, |buf| llvm::LLVMSetDataLayout(llmod, buf));
137137
str::as_c_str(targ_triple, |buf| llvm::LLVMSetTarget(llmod, buf));
138138
let targ_cfg = sess.targ_cfg;
139+
139140
let td = mk_target_data(sess.targ_cfg.target_strs.data_layout);
140-
let tn = mk_type_names();
141+
let tn = TypeNames::new();
142+
141143
let mut intrinsics = base::declare_intrinsics(llmod);
142144
if sess.opts.extra_debuginfo {
143145
base::declare_dbg_intrinsics(llmod, &mut intrinsics);
144146
}
145147
let int_type = T_int(targ_cfg);
146148
let float_type = T_float(targ_cfg);
147149
let tydesc_type = T_tydesc(targ_cfg);
148-
lib::llvm::associate_type(tn, @"tydesc", tydesc_type);
150+
tn.associate_type(@"tydesc", tydesc_type);
149151
let crate_map = decl_crate_map(sess, link_meta, llmod);
150152
let dbg_cx = if sess.opts.debuginfo {
151153
Some(debuginfo::DebugContext::new(llmod, name.to_owned()))

0 commit comments

Comments
 (0)