From 734494a04dc3be4745c89a1b9d0361c3a45ddfb4 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Sat, 21 Apr 2012 13:23:25 -0700 Subject: [PATCH] rustc: Cache constant C strings. Closes #2264 --- src/rustc/middle/trans/base.rs | 1 + src/rustc/middle/trans/common.rs | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/rustc/middle/trans/base.rs b/src/rustc/middle/trans/base.rs index 6b8e3c6c293..42f2ddd5dda 100644 --- a/src/rustc/middle/trans/base.rs +++ b/src/rustc/middle/trans/base.rs @@ -5024,6 +5024,7 @@ fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt, monomorphized: map::hashmap(hash_mono_id, {|a, b| a == b}), type_use_cache: util::common::new_def_hash(), vtables: map::hashmap(hash_mono_id, {|a, b| a == b}), + const_cstr_cache: map::str_hash(), module_data: str_hash::(), lltypes: ty::new_ty_hash(), names: new_namegen(), diff --git a/src/rustc/middle/trans/common.rs b/src/rustc/middle/trans/common.rs index 2cdea6ce8eb..68c14b8f64b 100644 --- a/src/rustc/middle/trans/common.rs +++ b/src/rustc/middle/trans/common.rs @@ -99,6 +99,8 @@ type crate_ctxt = { type_use_cache: hashmap, // Cache generated vtables vtables: hashmap, + // Cache of constant strings, + const_cstr_cache: hashmap, module_data: hashmap, lltypes: hashmap, names: namegen, @@ -762,6 +764,11 @@ fn C_u8(i: uint) -> ValueRef { ret C_integral(T_i8(), i as u64, False); } // This is a 'c-like' raw string, which differs from // our boxed-and-length-annotated strings. fn C_cstr(cx: @crate_ctxt, s: str) -> ValueRef { + alt cx.const_cstr_cache.find(s) { + some(llval) { ret llval; } + none { } + } + let sc = str::as_c_str(s) {|buf| llvm::LLVMConstString(buf, str::len(s) as c_uint, False) }; @@ -771,6 +778,9 @@ fn C_cstr(cx: @crate_ctxt, s: str) -> ValueRef { llvm::LLVMSetInitializer(g, sc); llvm::LLVMSetGlobalConstant(g, True); lib::llvm::SetLinkage(g, lib::llvm::InternalLinkage); + + cx.const_cstr_cache.insert(s, g); + ret g; }