about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2011-07-14 15:19:17 -0400
committerRafael Ávila de Espíndola <respindola@mozilla.com>2011-07-14 15:19:17 -0400
commitc124a025bfb421791b0b4bf1350f6203e346781a (patch)
treec208211e3d188ccd5e18dcbcef1f271ef91d2086
parentbe489ee9e2f30d2daf1c9726536631162e21dff5 (diff)
Move rustc to the new llvm type system. Requires an update to llvm trunk.
-rw-r--r--src/comp/lib/llvm.rs34
-rw-r--r--src/comp/middle/trans.rs61
-rw-r--r--src/rustllvm/rustllvm.def.in15
3 files changed, 43 insertions, 67 deletions
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs
index 0fb4fea03b5..2f0abed3d27 100644
--- a/src/comp/lib/llvm.rs
+++ b/src/comp/lib/llvm.rs
@@ -169,11 +169,6 @@ native mod llvm = "rustllvm" {
     fn LLVMGetTarget(ModuleRef M) -> sbuf;
     fn LLVMSetTarget(ModuleRef M, sbuf Triple);
 
-    /** See Module::addTypeName. */
-    fn LLVMAddTypeName(ModuleRef M, sbuf Name, TypeRef Ty) -> Bool;
-    fn LLVMDeleteTypeName(ModuleRef M, sbuf Name);
-    fn LLVMGetTypeByName(ModuleRef M, sbuf Name) -> TypeRef;
-
     /** See Module::dump. */
     fn LLVMDumpModule(ModuleRef M);
 
@@ -250,17 +245,9 @@ native mod llvm = "rustllvm" {
     /* Operations on other types */
     fn LLVMVoidTypeInContext(ContextRef C) -> TypeRef;
     fn LLVMLabelTypeInContext(ContextRef C) -> TypeRef;
-    fn LLVMOpaqueTypeInContext(ContextRef C) -> TypeRef;
 
     fn LLVMVoidType() -> TypeRef;
     fn LLVMLabelType() -> TypeRef;
-    fn LLVMOpaqueType() -> TypeRef;
-
-    /* Operations on type handles */
-    fn LLVMCreateTypeHandle(TypeRef PotentiallyAbstractTy) -> TypeHandleRef;
-    fn LLVMRefineType(TypeRef AbstractTy, TypeRef ConcreteTy);
-    fn LLVMResolveTypeHandle(TypeHandleRef TypeHandle) -> TypeRef;
-    fn LLVMDisposeTypeHandle(TypeHandleRef TypeHandle);
 
     /* Operations on all values */
     fn LLVMTypeOf(ValueRef Val) -> TypeRef;
@@ -792,7 +779,6 @@ native mod llvm = "rustllvm" {
     fn LLVMAddSCCPPass(PassManagerRef PM);
     fn LLVMAddDeadStoreEliminationPass(PassManagerRef PM);
     fn LLVMAddStripDeadPrototypesPass(PassManagerRef PM);
-    fn LLVMAddDeadTypeEliminationPass(PassManagerRef PM);
     fn LLVMAddConstantMergePass(PassManagerRef PM);
     fn LLVMAddArgumentPromotionPass(PassManagerRef PM);
     fn LLVMAddTailCallEliminationPass(PassManagerRef PM);
@@ -879,6 +865,14 @@ native mod llvm = "rustllvm" {
     /** Print the pass timings since static dtors aren't picking them up. */
     fn LLVMRustPrintPassTimings();
 
+    fn LLVMStructCreateNamed(ContextRef C, sbuf Name) -> TypeRef;
+
+    fn LLVMStructSetBody(TypeRef StructTy, *TypeRef ElementTypes,
+                         uint ElementCount, Bool Packed);
+
+    fn LLVMConstNamedStruct(TypeRef S, *ValueRef ConstantVals,
+                            uint Count) -> ValueRef;
+
     /** Links LLVM modules together. `Src` is destroyed by this call and
         must never be referenced again. */
     fn LLVMLinkModules(ModuleRef Dest, ModuleRef Src) -> Bool;
@@ -1398,18 +1392,6 @@ obj builder(BuilderRef B, @mutable bool terminated) {
 
 /* Memory-managed object interface to type handles. */
 
-obj type_handle_dtor(TypeHandleRef TH) {
-    drop { llvm::LLVMDisposeTypeHandle(TH); }
-}
-
-type type_handle = rec(TypeHandleRef llth, type_handle_dtor dtor);
-
-fn mk_type_handle() -> type_handle {
-    auto th = llvm::LLVMCreateTypeHandle(llvm::LLVMOpaqueType());
-    ret rec(llth=th, dtor=type_handle_dtor(th));
-}
-
-
 state obj type_names(std::map::hashmap[TypeRef, str] type_names,
                     std::map::hashmap[str, TypeRef] named_types) {
 
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 094223c9ce6..ece2fcae21f 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -40,10 +40,8 @@ import syntax::codemap::span;
 import lib::llvm::llvm;
 import lib::llvm::builder;
 import lib::llvm::target_data;
-import lib::llvm::type_handle;
 import lib::llvm::type_names;
 import lib::llvm::mk_target_data;
-import lib::llvm::mk_type_handle;
 import lib::llvm::mk_type_names;
 import lib::llvm::llvm::ModuleRef;
 import lib::llvm::llvm::ValueRef;
@@ -475,18 +473,29 @@ fn T_struct(&TypeRef[] elts) -> TypeRef {
                              False);
 }
 
-fn T_opaque() -> TypeRef { ret llvm::LLVMOpaqueType(); }
+fn T_named_struct(&str name) -> TypeRef {
+    auto c = llvm::LLVMGetGlobalContext();
+    ret llvm::LLVMStructCreateNamed(c, str::buf(name));
+}
+
+fn set_struct_body(TypeRef t, &TypeRef[] elts) {
+    llvm::LLVMStructSetBody(t, std::ivec::to_ptr(elts), std::ivec::len(elts),
+                            False);
+}
 
 fn T_empty_struct() -> TypeRef { ret T_struct(~[]); }
 
 fn T_rust_object() -> TypeRef {
-   auto e = T_ptr(T_empty_struct());
-   ret T_struct(~[e, e]);
+    auto t = T_named_struct("rust_object");
+    auto e = T_ptr(T_empty_struct());
+    set_struct_body(t, ~[e,e]);
+    ret t;
 }
 
 fn T_task() -> TypeRef {
-    auto t =
-        T_struct(~[T_int(), // Refcount
+    auto t = T_named_struct("task");
+
+    auto elems = ~[T_int(), // Refcount
                    T_int(), // Delegate pointer
                    T_int(), // Stack segment pointer
                    T_int(), // Runtime SP
@@ -495,7 +504,8 @@ fn T_task() -> TypeRef {
 
                    T_int(), // Domain pointer
                             // Crate cache pointer
-                   T_int()]);
+                   T_int()];
+    set_struct_body(t, elems);
     ret t;
 }
 
@@ -532,9 +542,8 @@ fn T_cmp_glue_fn(&crate_ctxt cx) -> TypeRef {
 }
 
 fn T_tydesc(TypeRef taskptr_type) -> TypeRef {
-    auto th = mk_type_handle();
-    auto abs_tydesc = llvm::LLVMResolveTypeHandle(th.llth);
-    auto tydescpp = T_ptr(T_ptr(abs_tydesc));
+    auto tydesc = T_named_struct("tydesc");
+    auto tydescpp = T_ptr(T_ptr(tydesc));
     auto pvoid = T_ptr(T_i8());
     auto glue_fn_ty =
         T_ptr(T_fn(~[T_ptr(T_nil()), taskptr_type, T_ptr(T_nil()), tydescpp,
@@ -542,8 +551,8 @@ fn T_tydesc(TypeRef taskptr_type) -> TypeRef {
     auto cmp_glue_fn_ty =
         T_ptr(T_fn(~[T_ptr(T_i1()), taskptr_type, T_ptr(T_nil()), tydescpp,
                      pvoid, pvoid, T_i8()], T_void()));
-    auto tydesc =
-        T_struct(~[tydescpp,   // first_param
+
+    auto elems = ~[tydescpp,   // first_param
                    T_int(),    // size
                    T_int(),    // align
                    glue_fn_ty, // copy_glue
@@ -553,11 +562,9 @@ fn T_tydesc(TypeRef taskptr_type) -> TypeRef {
                    glue_fn_ty, // mark_glue
                    glue_fn_ty, // obj_drop_glue
                    glue_fn_ty, // is_stateful
-                   cmp_glue_fn_ty]); // cmp_glue
-
-    llvm::LLVMRefineType(abs_tydesc, tydesc);
-    auto t = llvm::LLVMResolveTypeHandle(th.llth);
-    ret t;
+                   cmp_glue_fn_ty];
+    set_struct_body(tydesc, elems);
+    ret tydesc;
 }
 
 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 {
         case (ty::ty_type) { llty = T_ptr(cx.tydesc_type); }
     }
     assert (llty as int != 0);
-    if (cx.sess.get_opts().save_temps) {
-        llvm::LLVMAddTypeName(cx.llmod, str::buf(ty_to_short_str(cx.tcx, t)),
-                              llty);
-    }
     cx.lltypes.insert(t, llty);
     ret llty;
 }
@@ -1096,6 +1099,11 @@ fn C_struct(&ValueRef[] elts) -> ValueRef {
                               False);
 }
 
+fn C_named_struct(TypeRef T, &ValueRef[] elts) -> ValueRef {
+    ret llvm::LLVMConstNamedStruct(T, std::ivec::to_ptr(elts),
+                                   std::ivec::len(elts));
+}
+
 fn C_array(TypeRef ty, &ValueRef[] elts) -> ValueRef {
     ret llvm::LLVMConstArray(ty, std::ivec::to_ptr(elts),
                              std::ivec::len(elts));
@@ -1971,7 +1979,8 @@ fn emit_tydescs(&@crate_ctxt ccx) {
                 case (some(?v)) { ccx.stats.n_real_glues += 1u; v }
             };
         auto tydesc =
-            C_struct(~[C_null(T_ptr(T_ptr(ccx.tydesc_type))), ti.size,
+            C_named_struct(ccx.tydesc_type,
+                     ~[C_null(T_ptr(T_ptr(ccx.tydesc_type))), ti.size,
                        ti.align, copy_glue, // copy_glue
                        drop_glue, // drop_glue
                        free_glue, // free_glue
@@ -9074,11 +9083,6 @@ fn i2p(ValueRef v, TypeRef t) -> ValueRef {
     ret llvm::LLVMConstIntToPtr(v, t);
 }
 
-fn create_typedefs(&@crate_ctxt cx) {
-    llvm::LLVMAddTypeName(cx.llmod, str::buf("task"), cx.task_type);
-    llvm::LLVMAddTypeName(cx.llmod, str::buf("tydesc"), cx.tydesc_type);
-}
-
 fn declare_intrinsics(ModuleRef llmod) -> hashmap[str, ValueRef] {
     let TypeRef[] T_memmove32_args =
         ~[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,
              tydesc_type=tydesc_type,
              task_type=task_type);
     auto cx = new_local_ctxt(ccx);
-    create_typedefs(ccx);
     collect_items(ccx, crate);
     collect_tag_ctors(ccx, crate);
     trans_constants(ccx, crate);
diff --git a/src/rustllvm/rustllvm.def.in b/src/rustllvm/rustllvm.def.in
index 212c5be1ed4..19e58eec503 100644
--- a/src/rustllvm/rustllvm.def.in
+++ b/src/rustllvm/rustllvm.def.in
@@ -30,7 +30,6 @@ LLVMAddConstantPropagationPass
 LLVMAddCorrelatedValuePropagationPass
 LLVMAddDeadArgEliminationPass
 LLVMAddDeadStoreEliminationPass
-LLVMAddDeadTypeEliminationPass
 LLVMAddDemoteMemoryToRegisterPass
 LLVMAddDestination
 LLVMAddEarlyCSEPass
@@ -78,7 +77,6 @@ LLVMAddStripSymbolsPass
 LLVMAddTailCallEliminationPass
 LLVMAddTargetData
 LLVMAddTypeBasedAliasAnalysisPass
-LLVMAddTypeName
 LLVMAddVerifierPass
 LLVMAlignOf
 LLVMAppendBasicBlock
@@ -279,11 +277,9 @@ LLVMCreateModuleProviderForExistingModule
 LLVMCreateObjectFile
 LLVMCreatePassManager
 LLVMCreateTargetData
-LLVMCreateTypeHandle
 LLVMDeleteBasicBlock
 LLVMDeleteFunction
 LLVMDeleteGlobal
-LLVMDeleteTypeName
 LLVMDisposeBuilder
 LLVMDisposeExecutionEngine
 LLVMDisposeGenericValue
@@ -295,7 +291,6 @@ LLVMDisposeObjectFile
 LLVMDisposePassManager
 LLVMDisposeSectionIterator
 LLVMDisposeTargetData
-LLVMDisposeTypeHandle
 LLVMDoubleType
 LLVMDoubleTypeInContext
 LLVMDumpModule
@@ -388,10 +383,8 @@ LLVMGetSectionSize
 LLVMGetSections
 LLVMGetStructElementTypes
 LLVMGetTarget
-LLVMGetTypeByName
 LLVMGetTypeContext
 LLVMGetTypeKind
-LLVMGetTypeName
 LLVMGetUndef
 LLVMGetUsedValue
 LLVMGetUser
@@ -527,8 +520,6 @@ LLVMMoveBasicBlockAfter
 LLVMMoveBasicBlockBefore
 LLVMMoveToNextSection
 LLVMOffsetOfElement
-LLVMOpaqueType
-LLVMOpaqueTypeInContext
 LLVMPPCFP128Type
 LLVMPPCFP128TypeInContext
 LLVMParseBitcode
@@ -541,14 +532,12 @@ LLVMPositionBuilderBefore
 LLVMPreferredAlignmentOfGlobal
 LLVMPreferredAlignmentOfType
 LLVMRecompileAndRelinkFunction
-LLVMRefineType
 LLVMRemoveAttribute
 LLVMRemoveFunctionAttr
 LLVMRemoveInstrAttribute
 LLVMRemoveModule
 LLVMRemoveModuleProvider
 LLVMReplaceAllUsesWith
-LLVMResolveTypeHandle
 LLVMRunFunction
 LLVMRunFunctionAsMain
 LLVMRunFunctionPassManager
@@ -598,4 +587,6 @@ LLVMX86FP80Type
 LLVMX86FP80TypeInContext
 LLVMX86MMXType
 LLVMX86MMXTypeInContext
-
+LLVMConstNamedStruct
+LLVMStructCreateNamed
+LLVMStructSetBody