Skip to content

Commit 0ddb832

Browse files
committed
Teach trans and llvm to cooperate on producing tidier diagnostic names in trans.ty_str.
1 parent 10befcd commit 0ddb832

File tree

2 files changed

+226
-113
lines changed

2 files changed

+226
-113
lines changed

src/comp/lib/llvm.rs

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,18 +1151,70 @@ fn mk_type_handle() -> type_handle {
11511151
ret rec(llth=th, dtor=type_handle_dtor(th));
11521152
}
11531153

1154-
fn type_to_str(TypeRef ty) -> str {
1154+
1155+
state obj type_names(std.map.hashmap[TypeRef, str] type_names,
1156+
std.map.hashmap[str, TypeRef] named_types) {
1157+
1158+
fn associate(str s, TypeRef t) {
1159+
check (!named_types.contains_key(s));
1160+
check (!type_names.contains_key(t));
1161+
type_names.insert(t, s);
1162+
named_types.insert(s, t);
1163+
}
1164+
1165+
fn type_has_name(TypeRef t) -> bool {
1166+
ret type_names.contains_key(t);
1167+
}
1168+
1169+
fn get_name(TypeRef t) -> str {
1170+
ret type_names.get(t);
1171+
}
1172+
1173+
fn name_has_type(str s) -> bool {
1174+
ret named_types.contains_key(s);
1175+
}
1176+
1177+
fn get_type(str s) -> TypeRef {
1178+
ret named_types.get(s);
1179+
}
1180+
}
1181+
1182+
fn mk_type_names() -> type_names {
1183+
auto nt = util.common.new_str_hash[TypeRef]();
1184+
1185+
fn hash(&TypeRef t) -> uint {
1186+
ret t as uint;
1187+
}
1188+
1189+
fn eq(&TypeRef a, &TypeRef b) -> bool {
1190+
ret (a as uint) == (b as uint);
1191+
}
1192+
1193+
let std.map.hashfn[TypeRef] hasher = hash;
1194+
let std.map.eqfn[TypeRef] eqer = eq;
1195+
auto tn = std.map.mk_hashmap[TypeRef,str](hasher, eqer);
1196+
1197+
ret type_names(tn, nt);
1198+
}
1199+
1200+
fn type_to_str(type_names names, TypeRef ty) -> str {
11551201
let vec[TypeRef] v = vec();
1156-
ret type_to_str_inner(v, ty);
1202+
ret type_to_str_inner(names, v, ty);
11571203
}
11581204

1159-
fn type_to_str_inner(vec[TypeRef] outer0, TypeRef ty) -> str {
1205+
fn type_to_str_inner(type_names names,
1206+
vec[TypeRef] outer0, TypeRef ty) -> str {
1207+
1208+
if (names.type_has_name(ty)) {
1209+
ret names.get_name(ty);
1210+
}
11601211

11611212
auto outer = outer0 + vec(ty);
11621213

11631214
let int kind = llvm.LLVMGetTypeKind(ty);
11641215

1165-
fn tys_str(vec[TypeRef] outer, vec[TypeRef] tys) -> str {
1216+
fn tys_str(type_names names,
1217+
vec[TypeRef] outer, vec[TypeRef] tys) -> str {
11661218
let str s = "";
11671219
let bool first = true;
11681220
for (TypeRef t in tys) {
@@ -1171,7 +1223,7 @@ fn type_to_str_inner(vec[TypeRef] outer0, TypeRef ty) -> str {
11711223
} else {
11721224
s += ", ";
11731225
}
1174-
s += type_to_str_inner(outer, t);
1226+
s += type_to_str_inner(names, outer, t);
11751227
}
11761228
ret s;
11771229
}
@@ -1200,9 +1252,9 @@ fn type_to_str_inner(vec[TypeRef] outer0, TypeRef ty) -> str {
12001252
let vec[TypeRef] args =
12011253
_vec.init_elt[TypeRef](0 as TypeRef, n_args);
12021254
llvm.LLVMGetParamTypes(ty, _vec.buf[TypeRef](args));
1203-
s += tys_str(outer, args);
1255+
s += tys_str(names, outer, args);
12041256
s += ") -> ";
1205-
s += type_to_str_inner(outer, out_ty);
1257+
s += type_to_str_inner(names, outer, out_ty);
12061258
ret s;
12071259
}
12081260

@@ -1212,7 +1264,7 @@ fn type_to_str_inner(vec[TypeRef] outer0, TypeRef ty) -> str {
12121264
let vec[TypeRef] elts =
12131265
_vec.init_elt[TypeRef](0 as TypeRef, n_elts);
12141266
llvm.LLVMGetStructElementTypes(ty, _vec.buf[TypeRef](elts));
1215-
s += tys_str(outer, elts);
1267+
s += tys_str(names, outer, elts);
12161268
s += "}";
12171269
ret s;
12181270
}
@@ -1228,7 +1280,8 @@ fn type_to_str_inner(vec[TypeRef] outer0, TypeRef ty) -> str {
12281280
ret "*\\" + util.common.istr(n as int);
12291281
}
12301282
}
1231-
ret "*" + type_to_str_inner(outer, llvm.LLVMGetElementType(ty));
1283+
ret "*" + type_to_str_inner(names, outer,
1284+
llvm.LLVMGetElementType(ty));
12321285
}
12331286
12341287
case (12) { ret "Opaque"; }

0 commit comments

Comments
 (0)