diff --git a/src/libcore/logging.rs b/src/libcore/logging.rs
index a9f63b57fa5..6086b2edd7e 100644
--- a/src/libcore/logging.rs
+++ b/src/libcore/logging.rs
@@ -4,16 +4,13 @@
 #[forbid(deprecated_mode)];
 #[forbid(deprecated_pattern)];
 
-use cast::transmute;
-
-export console_on, console_off, log_type;
+export console_on, console_off;
 
 #[nolink]
 extern mod rustrt {
     #[legacy_exports];
     fn rust_log_console_on();
     fn rust_log_console_off();
-    fn rust_log_str(level: u32, string: *libc::c_char, size: libc::size_t);
 }
 
 /// Turns on logging to stdout globally
@@ -30,17 +27,4 @@ fn console_on() {
  */
 fn console_off() {
     rustrt::rust_log_console_off();
-}
-
-#[cfg(notest)]
-#[lang="log_type"]
-pub fn log_type<T>(level: u32, object: &T) {
-    let bytes = do io::with_bytes_writer() |writer| {
-        repr::write_repr(writer, object);
-    };
-    unsafe {
-        let len = bytes.len() as libc::size_t;
-        rustrt::rust_log_str(level, transmute(vec::raw::to_ptr(bytes)), len);
-    }
-}
-
+}
\ No newline at end of file
diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp
index 91c5760d3e9..02bc86f88b6 100644
--- a/src/rt/rust_builtin.cpp
+++ b/src/rt/rust_builtin.cpp
@@ -952,9 +952,9 @@ rust_call_tydesc_glue(void *root, size_t *tydesc, size_t glue_index) {
 
 // Don't run on the Rust stack!
 extern "C" void
-rust_log_str(uint32_t level, const char *str, size_t size) {
+rust_log_str(uint32_t level, const char *str) {
     rust_task *task = rust_get_current_task();
-    task->sched_loop->get_log().log(task, level, "%.*s", (int)size, str);
+    task->sched_loop->get_log().log(task, level, "%s", str);
 }
 
 //
diff --git a/src/rustc/middle/lang_items.rs b/src/rustc/middle/lang_items.rs
index ea22e3a7809..87201f5a4da 100644
--- a/src/rustc/middle/lang_items.rs
+++ b/src/rustc/middle/lang_items.rs
@@ -46,8 +46,7 @@ struct LanguageItems {
 
     mut str_eq_fn: Option<def_id>,
     mut uniq_str_eq_fn: Option<def_id>,
-    mut annihilate_fn: Option<def_id>,
-    mut log_type_fn: Option<def_id>
+    mut annihilate_fn: Option<def_id>
 }
 
 mod LanguageItems {
@@ -77,8 +76,7 @@ mod LanguageItems {
 
             str_eq_fn: None,
             uniq_str_eq_fn: None,
-            annihilate_fn: None,
-            log_type_fn: None
+            annihilate_fn: None
         }
     }
 }
@@ -113,7 +111,6 @@ fn LanguageItemCollector(crate: @crate, session: session,
     item_refs.insert(~"str_eq", &mut items.str_eq_fn);
     item_refs.insert(~"uniq_str_eq", &mut items.uniq_str_eq_fn);
     item_refs.insert(~"annihilate", &mut items.annihilate_fn);
-    item_refs.insert(~"log_type", &mut items.log_type_fn);
 
     LanguageItemCollector {
         crate: crate,
diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs
index 65a788991bf..964b418b765 100644
--- a/src/rustc/middle/trans/base.rs
+++ b/src/rustc/middle/trans/base.rs
@@ -2005,6 +2005,12 @@ fn create_main_wrapper(ccx: @crate_ctxt, sp: span, main_llfn: ValueRef,
         }
         Call(bcx, main_llfn, args);
 
+        // Call the box annihilator.
+        // XXX: Crashes.
+        //let did = bcx.tcx().lang_items.annihilate_fn.get();
+        //let bcx = callee::trans_rtcall_or_lang_call(bcx, did, ~[],
+        //                                            expr::Ignore);
+
         build_return(bcx);
         finish_fn(fcx, lltop);
         return llfdecl;
diff --git a/src/rustc/middle/trans/callee.rs b/src/rustc/middle/trans/callee.rs
index 1903469ee22..308ff75c82e 100644
--- a/src/rustc/middle/trans/callee.rs
+++ b/src/rustc/middle/trans/callee.rs
@@ -290,26 +290,6 @@ fn trans_rtcall_or_lang_call(bcx: block, did: ast::def_id, args: ~[ValueRef],
         ArgVals(args), dest, DontAutorefArg);
 }
 
-fn trans_rtcall_or_lang_call_with_type_params(bcx: block,
-                                              did: ast::def_id,
-                                              args: ~[ValueRef],
-                                              type_params: ~[ty::t],
-                                              dest: expr::Dest) -> block {
-    let fty;
-    if did.crate == ast::local_crate {
-        fty = ty::node_id_to_type(bcx.tcx(), did.node);
-    } else {
-        fty = csearch::get_type(bcx.tcx(), did).ty;
-    }
-
-    let rty = ty::ty_fn_ret(fty);
-    return callee::trans_call_inner(
-        bcx, None, fty, rty,
-        |bcx| trans_fn_ref_with_vtables_to_callee(bcx, did, 0, type_params,
-                                                  None),
-        ArgVals(args), dest, DontAutorefArg);
-}
-
 fn body_contains_ret(body: ast::blk) -> bool {
     let cx = {mut found: false};
     visit::visit_block(body, cx, visit::mk_vt(@{
diff --git a/src/rustc/middle/trans/controlflow.rs b/src/rustc/middle/trans/controlflow.rs
index 5d8b0fbbbe1..9570f37df75 100644
--- a/src/rustc/middle/trans/controlflow.rs
+++ b/src/rustc/middle/trans/controlflow.rs
@@ -190,12 +190,12 @@ fn trans_log(log_ex: @ast::expr,
 
             // Translate the value to be logged
             let val_datum = unpack_datum!(bcx, expr::trans_to_datum(bcx, e));
+            let tydesc = get_tydesc_simple(ccx, val_datum.ty);
 
             // Call the polymorphic log function
             let val = val_datum.to_ref_llval(bcx);
-            let did = bcx.tcx().lang_items.log_type_fn.get();
-            let bcx = callee::trans_rtcall_or_lang_call_with_type_params(
-                bcx, did, ~[level, val], ~[val_datum.ty], expr::Ignore);
+            let val = PointerCast(bcx, val, T_ptr(T_i8()));
+            Call(bcx, ccx.upcalls.log_type, [tydesc, val, level]);
             bcx
         }
     }