From 88574c3cea87bc8f789883bcd518b8a91fb1a776 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 15 Jul 2011 18:37:57 -0700 Subject: [PATCH] rustc: Implement interior string logging in DPS --- src/comp/back/upcall.rs | 3 +++ src/comp/middle/trans_dps.rs | 10 +++++++--- src/rt/rust_upcall.cpp | 10 ++++++++++ src/rt/rustrt.def.in | 1 + 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/comp/back/upcall.rs b/src/comp/back/upcall.rs index 400ed3beab8a..4c6b051b9a85 100644 --- a/src/comp/back/upcall.rs +++ b/src/comp/back/upcall.rs @@ -8,6 +8,7 @@ import middle::trans_common::T_bool; import middle::trans_common::T_i8; import middle::trans_common::T_i32; import middle::trans_common::T_int; +import middle::trans_common::T_ivec; import middle::trans_common::T_nil; import middle::trans_common::T_opaque_chan_ptr; import middle::trans_common::T_opaque_ivec; @@ -28,6 +29,7 @@ type upcalls = ValueRef log_float, ValueRef log_double, ValueRef log_str, + ValueRef log_istr, ValueRef trace_word, ValueRef trace_str, ValueRef new_port, @@ -82,6 +84,7 @@ fn declare_upcalls(type_names tn, TypeRef tydesc_type, TypeRef taskptr_type, log_float=dv("log_float", ~[T_i32(), T_f32()]), log_double=dv("log_double", ~[T_i32(), T_ptr(T_f64())]), log_str=dv("log_str", ~[T_i32(), T_ptr(T_str())]), + log_istr=dv("log_istr", ~[T_i32(), T_ptr(T_ivec(T_i8()))]), trace_word=dv("trace_word", ~[T_int()]), trace_str=dv("trace_str", ~[T_ptr(T_i8())]), new_port=d("new_port", ~[T_size_t()], T_opaque_port_ptr()), diff --git a/src/comp/middle/trans_dps.rs b/src/comp/middle/trans_dps.rs index e4497ac8d8e8..6aecf83bd695 100644 --- a/src/comp/middle/trans_dps.rs +++ b/src/comp/middle/trans_dps.rs @@ -222,6 +222,9 @@ fn trans_log(&@block_ctxt cx, &span sp, int level, &@ast::expr expr) ty::ty_machine(ast::ty_u32) { by_val = true; llupcall = bcx_ccx(bcx).upcalls.log_int; } + ty::ty_istr { + by_val = false; llupcall = bcx_ccx(bcx).upcalls.log_istr; + } _ { bcx_ccx(bcx).sess.span_unimpl(sp, "logging for values of type " + ppaux::ty_to_str(bcx_tcx(bcx), t)); @@ -322,11 +325,12 @@ fn trans_lit_str_common(&@crate_ctxt ccx, &str s) none); } - auto llarray = tc::C_array(tc::T_i8(), array); + auto llheappart = tc::C_struct(~[tc::C_uint(len), + tc::C_array(tc::T_i8(), array)]); ret tup(tc::C_struct(~[tc::C_uint(0u), tc::C_uint(abi::ivec_default_length), - tc::C_null(tc::T_ptr(lltype_of(llarray)))]), - some(llarray)); + tc::C_null(tc::T_ptr(lltype_of(llheappart)))]), + some(llheappart)); } // As above, we don't use destination-passing style here. diff --git a/src/rt/rust_upcall.cpp b/src/rt/rust_upcall.cpp index b6b8fb286684..d734625fa30f 100644 --- a/src/rt/rust_upcall.cpp +++ b/src/rt/rust_upcall.cpp @@ -75,6 +75,16 @@ upcall_log_str(rust_task *task, uint32_t level, rust_str *str) { } } +extern "C" CDECL void +upcall_log_istr(rust_task *task, uint32_t level, rust_ivec *str) { + LOG_UPCALL_ENTRY(task); + if (task->sched->log_lvl < level) + return; + const char *buf = (const char *) + (str->fill ? str->payload.data : str->payload.ptr->data); + task->sched->log(task, level, "rust: %s", buf); +} + extern "C" CDECL void upcall_trace_word(rust_task *task, uintptr_t i) { LOG_UPCALL_ENTRY(task); diff --git a/src/rt/rustrt.def.in b/src/rt/rustrt.def.in index dc94c73d813d..f762f4a9be3c 100644 --- a/src/rt/rustrt.def.in +++ b/src/rt/rustrt.def.in @@ -68,6 +68,7 @@ upcall_kill upcall_log_double upcall_log_float upcall_log_int +upcall_log_istr upcall_log_str upcall_malloc upcall_mark