Skip to content

Commit c124a02

Browse files
committed
Move rustc to the new llvm type system. Requires an update to llvm trunk.
1 parent be489ee commit c124a02

File tree

3 files changed

+43
-67
lines changed

3 files changed

+43
-67
lines changed

src/comp/lib/llvm.rs

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,6 @@ native mod llvm = "rustllvm" {
169169
fn LLVMGetTarget(ModuleRef M) -> sbuf;
170170
fn LLVMSetTarget(ModuleRef M, sbuf Triple);
171171

172-
/** See Module::addTypeName. */
173-
fn LLVMAddTypeName(ModuleRef M, sbuf Name, TypeRef Ty) -> Bool;
174-
fn LLVMDeleteTypeName(ModuleRef M, sbuf Name);
175-
fn LLVMGetTypeByName(ModuleRef M, sbuf Name) -> TypeRef;
176-
177172
/** See Module::dump. */
178173
fn LLVMDumpModule(ModuleRef M);
179174

@@ -250,17 +245,9 @@ native mod llvm = "rustllvm" {
250245
/* Operations on other types */
251246
fn LLVMVoidTypeInContext(ContextRef C) -> TypeRef;
252247
fn LLVMLabelTypeInContext(ContextRef C) -> TypeRef;
253-
fn LLVMOpaqueTypeInContext(ContextRef C) -> TypeRef;
254248

255249
fn LLVMVoidType() -> TypeRef;
256250
fn LLVMLabelType() -> TypeRef;
257-
fn LLVMOpaqueType() -> TypeRef;
258-
259-
/* Operations on type handles */
260-
fn LLVMCreateTypeHandle(TypeRef PotentiallyAbstractTy) -> TypeHandleRef;
261-
fn LLVMRefineType(TypeRef AbstractTy, TypeRef ConcreteTy);
262-
fn LLVMResolveTypeHandle(TypeHandleRef TypeHandle) -> TypeRef;
263-
fn LLVMDisposeTypeHandle(TypeHandleRef TypeHandle);
264251

265252
/* Operations on all values */
266253
fn LLVMTypeOf(ValueRef Val) -> TypeRef;
@@ -792,7 +779,6 @@ native mod llvm = "rustllvm" {
792779
fn LLVMAddSCCPPass(PassManagerRef PM);
793780
fn LLVMAddDeadStoreEliminationPass(PassManagerRef PM);
794781
fn LLVMAddStripDeadPrototypesPass(PassManagerRef PM);
795-
fn LLVMAddDeadTypeEliminationPass(PassManagerRef PM);
796782
fn LLVMAddConstantMergePass(PassManagerRef PM);
797783
fn LLVMAddArgumentPromotionPass(PassManagerRef PM);
798784
fn LLVMAddTailCallEliminationPass(PassManagerRef PM);
@@ -879,6 +865,14 @@ native mod llvm = "rustllvm" {
879865
/** Print the pass timings since static dtors aren't picking them up. */
880866
fn LLVMRustPrintPassTimings();
881867

868+
fn LLVMStructCreateNamed(ContextRef C, sbuf Name) -> TypeRef;
869+
870+
fn LLVMStructSetBody(TypeRef StructTy, *TypeRef ElementTypes,
871+
uint ElementCount, Bool Packed);
872+
873+
fn LLVMConstNamedStruct(TypeRef S, *ValueRef ConstantVals,
874+
uint Count) -> ValueRef;
875+
882876
/** Links LLVM modules together. `Src` is destroyed by this call and
883877
must never be referenced again. */
884878
fn LLVMLinkModules(ModuleRef Dest, ModuleRef Src) -> Bool;
@@ -1398,18 +1392,6 @@ obj builder(BuilderRef B, @mutable bool terminated) {
13981392

13991393
/* Memory-managed object interface to type handles. */
14001394

1401-
obj type_handle_dtor(TypeHandleRef TH) {
1402-
drop { llvm::LLVMDisposeTypeHandle(TH); }
1403-
}
1404-
1405-
type type_handle = rec(TypeHandleRef llth, type_handle_dtor dtor);
1406-
1407-
fn mk_type_handle() -> type_handle {
1408-
auto th = llvm::LLVMCreateTypeHandle(llvm::LLVMOpaqueType());
1409-
ret rec(llth=th, dtor=type_handle_dtor(th));
1410-
}
1411-
1412-
14131395
state obj type_names(std::map::hashmap[TypeRef, str] type_names,
14141396
std::map::hashmap[str, TypeRef] named_types) {
14151397

src/comp/middle/trans.rs

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,8 @@ import syntax::codemap::span;
4040
import lib::llvm::llvm;
4141
import lib::llvm::builder;
4242
import lib::llvm::target_data;
43-
import lib::llvm::type_handle;
4443
import lib::llvm::type_names;
4544
import lib::llvm::mk_target_data;
46-
import lib::llvm::mk_type_handle;
4745
import lib::llvm::mk_type_names;
4846
import lib::llvm::llvm::ModuleRef;
4947
import lib::llvm::llvm::ValueRef;
@@ -475,18 +473,29 @@ fn T_struct(&TypeRef[] elts) -> TypeRef {
475473
False);
476474
}
477475

478-
fn T_opaque() -> TypeRef { ret llvm::LLVMOpaqueType(); }
476+
fn T_named_struct(&str name) -> TypeRef {
477+
auto c = llvm::LLVMGetGlobalContext();
478+
ret llvm::LLVMStructCreateNamed(c, str::buf(name));
479+
}
480+
481+
fn set_struct_body(TypeRef t, &TypeRef[] elts) {
482+
llvm::LLVMStructSetBody(t, std::ivec::to_ptr(elts), std::ivec::len(elts),
483+
False);
484+
}
479485

480486
fn T_empty_struct() -> TypeRef { ret T_struct(~[]); }
481487

482488
fn T_rust_object() -> TypeRef {
483-
auto e = T_ptr(T_empty_struct());
484-
ret T_struct(~[e, e]);
489+
auto t = T_named_struct("rust_object");
490+
auto e = T_ptr(T_empty_struct());
491+
set_struct_body(t, ~[e,e]);
492+
ret t;
485493
}
486494

487495
fn T_task() -> TypeRef {
488-
auto t =
489-
T_struct(~[T_int(), // Refcount
496+
auto t = T_named_struct("task");
497+
498+
auto elems = ~[T_int(), // Refcount
490499
T_int(), // Delegate pointer
491500
T_int(), // Stack segment pointer
492501
T_int(), // Runtime SP
@@ -495,7 +504,8 @@ fn T_task() -> TypeRef {
495504

496505
T_int(), // Domain pointer
497506
// Crate cache pointer
498-
T_int()]);
507+
T_int()];
508+
set_struct_body(t, elems);
499509
ret t;
500510
}
501511

@@ -532,18 +542,17 @@ fn T_cmp_glue_fn(&crate_ctxt cx) -> TypeRef {
532542
}
533543

534544
fn T_tydesc(TypeRef taskptr_type) -> TypeRef {
535-
auto th = mk_type_handle();
536-
auto abs_tydesc = llvm::LLVMResolveTypeHandle(th.llth);
537-
auto tydescpp = T_ptr(T_ptr(abs_tydesc));
545+
auto tydesc = T_named_struct("tydesc");
546+
auto tydescpp = T_ptr(T_ptr(tydesc));
538547
auto pvoid = T_ptr(T_i8());
539548
auto glue_fn_ty =
540549
T_ptr(T_fn(~[T_ptr(T_nil()), taskptr_type, T_ptr(T_nil()), tydescpp,
541550
pvoid], T_void()));
542551
auto cmp_glue_fn_ty =
543552
T_ptr(T_fn(~[T_ptr(T_i1()), taskptr_type, T_ptr(T_nil()), tydescpp,
544553
pvoid, pvoid, T_i8()], T_void()));
545-
auto tydesc =
546-
T_struct(~[tydescpp, // first_param
554+
555+
auto elems = ~[tydescpp, // first_param
547556
T_int(), // size
548557
T_int(), // align
549558
glue_fn_ty, // copy_glue
@@ -553,11 +562,9 @@ fn T_tydesc(TypeRef taskptr_type) -> TypeRef {
553562
glue_fn_ty, // mark_glue
554563
glue_fn_ty, // obj_drop_glue
555564
glue_fn_ty, // is_stateful
556-
cmp_glue_fn_ty]); // cmp_glue
557-
558-
llvm::LLVMRefineType(abs_tydesc, tydesc);
559-
auto t = llvm::LLVMResolveTypeHandle(th.llth);
560-
ret t;
565+
cmp_glue_fn_ty];
566+
set_struct_body(tydesc, elems);
567+
ret tydesc;
561568
}
562569

563570
fn T_array(TypeRef t, uint n) -> TypeRef { ret llvm::LLVMArrayType(t, n); }
@@ -915,10 +922,6 @@ fn type_of_inner(&@crate_ctxt cx, &span sp, &ty::t t) -> TypeRef {
915922
case (ty::ty_type) { llty = T_ptr(cx.tydesc_type); }
916923
}
917924
assert (llty as int != 0);
918-
if (cx.sess.get_opts().save_temps) {
919-
llvm::LLVMAddTypeName(cx.llmod, str::buf(ty_to_short_str(cx.tcx, t)),
920-
llty);
921-
}
922925
cx.lltypes.insert(t, llty);
923926
ret llty;
924927
}
@@ -1096,6 +1099,11 @@ fn C_struct(&ValueRef[] elts) -> ValueRef {
10961099
False);
10971100
}
10981101

1102+
fn C_named_struct(TypeRef T, &ValueRef[] elts) -> ValueRef {
1103+
ret llvm::LLVMConstNamedStruct(T, std::ivec::to_ptr(elts),
1104+
std::ivec::len(elts));
1105+
}
1106+
10991107
fn C_array(TypeRef ty, &ValueRef[] elts) -> ValueRef {
11001108
ret llvm::LLVMConstArray(ty, std::ivec::to_ptr(elts),
11011109
std::ivec::len(elts));
@@ -1971,7 +1979,8 @@ fn emit_tydescs(&@crate_ctxt ccx) {
19711979
case (some(?v)) { ccx.stats.n_real_glues += 1u; v }
19721980
};
19731981
auto tydesc =
1974-
C_struct(~[C_null(T_ptr(T_ptr(ccx.tydesc_type))), ti.size,
1982+
C_named_struct(ccx.tydesc_type,
1983+
~[C_null(T_ptr(T_ptr(ccx.tydesc_type))), ti.size,
19751984
ti.align, copy_glue, // copy_glue
19761985
drop_glue, // drop_glue
19771986
free_glue, // free_glue
@@ -9074,11 +9083,6 @@ fn i2p(ValueRef v, TypeRef t) -> ValueRef {
90749083
ret llvm::LLVMConstIntToPtr(v, t);
90759084
}
90769085

9077-
fn create_typedefs(&@crate_ctxt cx) {
9078-
llvm::LLVMAddTypeName(cx.llmod, str::buf("task"), cx.task_type);
9079-
llvm::LLVMAddTypeName(cx.llmod, str::buf("tydesc"), cx.tydesc_type);
9080-
}
9081-
90829086
fn declare_intrinsics(ModuleRef llmod) -> hashmap[str, ValueRef] {
90839087
let TypeRef[] T_memmove32_args =
90849088
~[T_ptr(T_i8()), T_ptr(T_i8()), T_i32(), T_i32(), T_i1()];
@@ -9298,7 +9302,6 @@ fn trans_crate(&session::session sess, &@ast::crate crate, &ty::ctxt tcx,
92989302
tydesc_type=tydesc_type,
92999303
task_type=task_type);
93009304
auto cx = new_local_ctxt(ccx);
9301-
create_typedefs(ccx);
93029305
collect_items(ccx, crate);
93039306
collect_tag_ctors(ccx, crate);
93049307
trans_constants(ccx, crate);

src/rustllvm/rustllvm.def.in

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ LLVMAddConstantPropagationPass
3030
LLVMAddCorrelatedValuePropagationPass
3131
LLVMAddDeadArgEliminationPass
3232
LLVMAddDeadStoreEliminationPass
33-
LLVMAddDeadTypeEliminationPass
3433
LLVMAddDemoteMemoryToRegisterPass
3534
LLVMAddDestination
3635
LLVMAddEarlyCSEPass
@@ -78,7 +77,6 @@ LLVMAddStripSymbolsPass
7877
LLVMAddTailCallEliminationPass
7978
LLVMAddTargetData
8079
LLVMAddTypeBasedAliasAnalysisPass
81-
LLVMAddTypeName
8280
LLVMAddVerifierPass
8381
LLVMAlignOf
8482
LLVMAppendBasicBlock
@@ -279,11 +277,9 @@ LLVMCreateModuleProviderForExistingModule
279277
LLVMCreateObjectFile
280278
LLVMCreatePassManager
281279
LLVMCreateTargetData
282-
LLVMCreateTypeHandle
283280
LLVMDeleteBasicBlock
284281
LLVMDeleteFunction
285282
LLVMDeleteGlobal
286-
LLVMDeleteTypeName
287283
LLVMDisposeBuilder
288284
LLVMDisposeExecutionEngine
289285
LLVMDisposeGenericValue
@@ -295,7 +291,6 @@ LLVMDisposeObjectFile
295291
LLVMDisposePassManager
296292
LLVMDisposeSectionIterator
297293
LLVMDisposeTargetData
298-
LLVMDisposeTypeHandle
299294
LLVMDoubleType
300295
LLVMDoubleTypeInContext
301296
LLVMDumpModule
@@ -388,10 +383,8 @@ LLVMGetSectionSize
388383
LLVMGetSections
389384
LLVMGetStructElementTypes
390385
LLVMGetTarget
391-
LLVMGetTypeByName
392386
LLVMGetTypeContext
393387
LLVMGetTypeKind
394-
LLVMGetTypeName
395388
LLVMGetUndef
396389
LLVMGetUsedValue
397390
LLVMGetUser
@@ -527,8 +520,6 @@ LLVMMoveBasicBlockAfter
527520
LLVMMoveBasicBlockBefore
528521
LLVMMoveToNextSection
529522
LLVMOffsetOfElement
530-
LLVMOpaqueType
531-
LLVMOpaqueTypeInContext
532523
LLVMPPCFP128Type
533524
LLVMPPCFP128TypeInContext
534525
LLVMParseBitcode
@@ -541,14 +532,12 @@ LLVMPositionBuilderBefore
541532
LLVMPreferredAlignmentOfGlobal
542533
LLVMPreferredAlignmentOfType
543534
LLVMRecompileAndRelinkFunction
544-
LLVMRefineType
545535
LLVMRemoveAttribute
546536
LLVMRemoveFunctionAttr
547537
LLVMRemoveInstrAttribute
548538
LLVMRemoveModule
549539
LLVMRemoveModuleProvider
550540
LLVMReplaceAllUsesWith
551-
LLVMResolveTypeHandle
552541
LLVMRunFunction
553542
LLVMRunFunctionAsMain
554543
LLVMRunFunctionPassManager
@@ -598,4 +587,6 @@ LLVMX86FP80Type
598587
LLVMX86FP80TypeInContext
599588
LLVMX86MMXType
600589
LLVMX86MMXTypeInContext
601-
590+
LLVMConstNamedStruct
591+
LLVMStructCreateNamed
592+
LLVMStructSetBody

0 commit comments

Comments
 (0)