Convert rustc::lib::llvm to istr::sbufs. Issue #855

This commit is contained in:
Brian Anderson 2011-08-26 15:36:18 -07:00
parent 138973335a
commit d7fa75413f
10 changed files with 447 additions and 236 deletions

View file

@ -34,23 +34,23 @@ tag output_type {
fn llvm_err(sess: session::session, msg: &istr) { fn llvm_err(sess: session::session, msg: &istr) {
let buf = llvm::LLVMRustGetLastError(); let buf = llvm::LLVMRustGetLastError();
if buf as uint == 0u { if buf == std::ptr::null() {
sess.fatal(istr::to_estr(msg)); sess.fatal(istr::to_estr(msg));
} else { } else {
sess.fatal( sess.fatal(
istr::to_estr(msg) + ": " + str::str_from_cstr(buf)); istr::to_estr(msg + ~": " + istr::str_from_cstr(buf)));
} }
} }
fn link_intrinsics(sess: session::session, llmod: ModuleRef) { fn link_intrinsics(sess: session::session, llmod: ModuleRef) {
let path = istr::to_estr( let path =
fs::connect(istr::from_estr(sess.get_opts().sysroot), fs::connect(istr::from_estr(sess.get_opts().sysroot),
~"lib/intrinsics.bc")); ~"lib/intrinsics.bc");
let membuf = let membuf = istr::as_buf(path, { |buf|
llvm::LLVMRustCreateMemoryBufferWithContentsOfFile(str::buf(path)); llvm::LLVMRustCreateMemoryBufferWithContentsOfFile(buf)
});
if membuf as uint == 0u { if membuf as uint == 0u {
llvm_err(sess, ~"installation problem: couldn't open " llvm_err(sess, ~"installation problem: couldn't open " + path);
+ istr::from_estr(path));
fail; fail;
} }
let llintrinsicsmod = llvm::LLVMRustParseBitcode(membuf); let llintrinsicsmod = llvm::LLVMRustParseBitcode(membuf);
@ -104,14 +104,16 @@ mod write {
output_type_bitcode. { output_type_bitcode. {
if opts.optimize != 0u { if opts.optimize != 0u {
let filename = mk_intermediate_name(output, ~"no-opt.bc"); let filename = mk_intermediate_name(output, ~"no-opt.bc");
let filename = istr::to_estr(filename); istr::as_buf(filename, { |buf|
llvm::LLVMWriteBitcodeToFile(llmod, str::buf(filename)); llvm::LLVMWriteBitcodeToFile(llmod, buf)
});
} }
} }
_ { _ {
let filename = mk_intermediate_name(output, ~"bc"); let filename = mk_intermediate_name(output, ~"bc");
let filename = istr::to_estr(filename); istr::as_buf(filename, { |buf|
llvm::LLVMWriteBitcodeToFile(llmod, str::buf(filename)); llvm::LLVMWriteBitcodeToFile(llmod, buf)
});
} }
} }
} }
@ -183,20 +185,24 @@ mod write {
// Always output the bitcode file with --save-temps // Always output the bitcode file with --save-temps
let filename = mk_intermediate_name(output, ~"opt.bc"); let filename = mk_intermediate_name(output, ~"opt.bc");
let filename = istr::to_estr(filename);
llvm::LLVMRunPassManager(pm.llpm, llmod); llvm::LLVMRunPassManager(pm.llpm, llmod);
llvm::LLVMWriteBitcodeToFile(llmod, str::buf(filename)); istr::as_buf(filename, { |buf|
llvm::LLVMWriteBitcodeToFile(llmod, buf)
});
pm = mk_pass_manager(); pm = mk_pass_manager();
// Save the assembly file if -S is used // Save the assembly file if -S is used
if opts.output_type == output_type_assembly { if opts.output_type == output_type_assembly {
let triple = istr::to_estr(x86::get_target_triple()); let _: () =
let output = istr::to_estr(output); istr::as_buf(x86::get_target_triple(), { |buf_t|
llvm::LLVMRustWriteOutputFile(pm.llpm, llmod, istr::as_buf(output, { |buf_o|
str::buf(triple), llvm::LLVMRustWriteOutputFile(
str::buf(output), pm.llpm, llmod,
LLVMAssemblyFile, buf_t,
CodeGenOptLevel); buf_o,
LLVMAssemblyFile,
CodeGenOptLevel)
})});
} }
@ -204,24 +210,29 @@ mod write {
// This .o is needed when an exe is built // This .o is needed when an exe is built
if opts.output_type == output_type_object || if opts.output_type == output_type_object ||
opts.output_type == output_type_exe { opts.output_type == output_type_exe {
let triple = istr::to_estr(x86::get_target_triple()); let _: () =
let output = istr::to_estr(output); istr::as_buf(x86::get_target_triple(), { |buf_t|
llvm::LLVMRustWriteOutputFile(pm.llpm, llmod, istr::as_buf(output, { |buf_o|
str::buf(triple), llvm::LLVMRustWriteOutputFile(
str::buf(output), pm.llpm, llmod,
LLVMObjectFile, buf_t,
CodeGenOptLevel); buf_o,
LLVMObjectFile,
CodeGenOptLevel)
})});
} }
} else { } else {
// If we aren't saving temps then just output the file // If we aren't saving temps then just output the file
// type corresponding to the '-c' or '-S' flag used // type corresponding to the '-c' or '-S' flag used
let triple = istr::to_estr(x86::get_target_triple()); let _: () = istr::as_buf(x86::get_target_triple(), { |buf_t|
let output = istr::to_estr(output); istr::as_buf(output, { |buf_o|
llvm::LLVMRustWriteOutputFile(pm.llpm, llmod, llvm::LLVMRustWriteOutputFile(pm.llpm, llmod,
str::buf(triple), buf_t,
str::buf(output), FileType, buf_o,
CodeGenOptLevel); FileType,
CodeGenOptLevel)
})});
} }
// Clean up and return // Clean up and return
@ -233,8 +244,9 @@ mod write {
// flag, then output it here // flag, then output it here
llvm::LLVMRunPassManager(pm.llpm, llmod); llvm::LLVMRunPassManager(pm.llpm, llmod);
let output = istr::to_estr(output); istr::as_buf(output, { |buf|
llvm::LLVMWriteBitcodeToFile(llmod, str::buf(output)); llvm::LLVMWriteBitcodeToFile(llmod, buf)
});
llvm::LLVMDisposeModule(llmod); llvm::LLVMDisposeModule(llmod);
if opts.time_llvm_passes { llvm::LLVMRustPrintPassTimings(); } if opts.time_llvm_passes { llvm::LLVMRustPrintPassTimings(); }
} }

View file

@ -325,8 +325,8 @@ fn get_default_sysroot(binary: str) -> str {
} }
fn build_target_config() -> @session::config { fn build_target_config() -> @session::config {
let triple: str = let triple: str = istr::to_estr(
std::str::rustrt::str_from_cstr(llvm::llvm::LLVMRustGetHostTriple()); istr::str_from_cstr(llvm::llvm::LLVMRustGetHostTriple()));
let target_cfg: @session::config = let target_cfg: @session::config =
@{os: get_os(triple), @{os: get_os(triple),
arch: get_arch(triple), arch: get_arch(triple),

View file

@ -1,7 +1,6 @@
import std::vec; import std::vec;
import std::str;
import std::istr; import std::istr;
import std::str::rustrt::sbuf; import std::istr::sbuf;
import llvm::ModuleRef; import llvm::ModuleRef;
import llvm::ContextRef; import llvm::ContextRef;
@ -1070,7 +1069,9 @@ resource target_data_res(TD: TargetDataRef) {
type target_data = {lltd: TargetDataRef, dtor: @target_data_res}; type target_data = {lltd: TargetDataRef, dtor: @target_data_res};
fn mk_target_data(string_rep: str) -> target_data { fn mk_target_data(string_rep: str) -> target_data {
let lltd = llvm::LLVMCreateTargetData(str::buf(string_rep)); let lltd = istr::as_buf(istr::from_estr(string_rep), { |buf|
llvm::LLVMCreateTargetData(buf)
});
ret {lltd: lltd, dtor: @target_data_res(lltd)}; ret {lltd: lltd, dtor: @target_data_res(lltd)};
} }

View file

@ -192,15 +192,16 @@ fn find_library_crate_aux(nn: &{prefix: str, suffix: str}, crate_name: str,
} }
fn get_metadata_section(filename: str) -> option::t<@[u8]> { fn get_metadata_section(filename: str) -> option::t<@[u8]> {
let b = str::buf(filename); let mb = istr::as_buf(istr::from_estr(filename), { |buf|
let mb = llvm::LLVMRustCreateMemoryBufferWithContentsOfFile(b); llvm::LLVMRustCreateMemoryBufferWithContentsOfFile(buf)
});
if mb as int == 0 { ret option::none::<@[u8]>; } if mb as int == 0 { ret option::none::<@[u8]>; }
let of = mk_object_file(mb); let of = mk_object_file(mb);
let si = mk_section_iter(of.llof); let si = mk_section_iter(of.llof);
while llvm::LLVMIsSectionIteratorAtEnd(of.llof, si.llsi) == False { while llvm::LLVMIsSectionIteratorAtEnd(of.llof, si.llsi) == False {
let name_buf = llvm::LLVMGetSectionName(si.llsi); let name_buf = llvm::LLVMGetSectionName(si.llsi);
let name = str::str_from_cstr(name_buf); let name = istr::str_from_cstr(name_buf);
if str::eq(name, istr::to_estr(x86::get_meta_sect_name())) { if istr::eq(name, x86::get_meta_sect_name()) {
let cbuf = llvm::LLVMGetSectionContents(si.llsi); let cbuf = llvm::LLVMGetSectionContents(si.llsi);
let csz = llvm::LLVMGetSectionSize(si.llsi); let csz = llvm::LLVMGetSectionSize(si.llsi);
let cvbuf: *u8 = std::unsafe::reinterpret_cast(cbuf); let cvbuf: *u8 = std::unsafe::reinterpret_cast(cbuf);

View file

@ -11,6 +11,7 @@ import std::option::none;
import std::option::some; import std::option::some;
import std::ptr; import std::ptr;
import std::str; import std::str;
import std::istr;
import std::unsafe; import std::unsafe;
import std::vec; import std::vec;
@ -22,8 +23,9 @@ type ctxt = @{mutable next_tydesc_num: uint};
fn mk_ctxt() -> ctxt { ret @{mutable next_tydesc_num: 0u}; } fn mk_ctxt() -> ctxt { ret @{mutable next_tydesc_num: 0u}; }
fn add_global(ccx: &@crate_ctxt, llval: ValueRef, name: str) -> ValueRef { fn add_global(ccx: &@crate_ctxt, llval: ValueRef, name: str) -> ValueRef {
let llglobal = let llglobal = istr::as_buf(istr::from_estr(name), { |buf|
lll::LLVMAddGlobal(ccx.llmod, val_ty(llval), str::buf(name)); lll::LLVMAddGlobal(ccx.llmod, val_ty(llval), buf)
});
lll::LLVMSetInitializer(llglobal, llval); lll::LLVMSetInitializer(llglobal, llval);
lll::LLVMSetGlobalConstant(llglobal, True); lll::LLVMSetGlobalConstant(llglobal, True);
ret llglobal; ret llglobal;

View file

@ -31,6 +31,7 @@ import std::map::hashmap;
import std::option::none; import std::option::none;
import std::option::some; import std::option::some;
import std::str; import std::str;
import std::istr;
import ty_ctxt = middle::ty::ctxt; import ty_ctxt = middle::ty::ctxt;
@ -86,9 +87,9 @@ fn eq_res_info(a: &res_info, b: &res_info) -> bool {
fn mk_global(ccx: &@crate_ctxt, name: &str, llval: ValueRef, fn mk_global(ccx: &@crate_ctxt, name: &str, llval: ValueRef,
internal: bool) -> ValueRef { internal: bool) -> ValueRef {
let llglobal = let llglobal = istr::as_buf(istr::from_estr(name), { |buf|
lib::llvm::llvm::LLVMAddGlobal(ccx.llmod, val_ty(llval), lib::llvm::llvm::LLVMAddGlobal(ccx.llmod, val_ty(llval), buf)
str::buf(name)); });
lib::llvm::llvm::LLVMSetInitializer(llglobal, llval); lib::llvm::llvm::LLVMSetInitializer(llglobal, llval);
lib::llvm::llvm::LLVMSetGlobalConstant(llglobal, True); lib::llvm::llvm::LLVMSetGlobalConstant(llglobal, True);
@ -248,9 +249,9 @@ fn s_float(_tcx: &ty_ctxt) -> u8 {
fn mk_ctxt(llmod: ModuleRef) -> ctxt { fn mk_ctxt(llmod: ModuleRef) -> ctxt {
let llshapetablesty = trans_common::T_named_struct("shapes"); let llshapetablesty = trans_common::T_named_struct("shapes");
let llshapetables = let llshapetables = istr::as_buf(~"shapes", { |buf|
lib::llvm::llvm::LLVMAddGlobal(llmod, llshapetablesty, lib::llvm::llvm::LLVMAddGlobal(llmod, llshapetablesty, buf)
str::buf("shapes")); });
ret {mutable next_tag_id: 0u16, ret {mutable next_tag_id: 0u16,
pad: 0u16, pad: 0u16,

View file

@ -324,7 +324,9 @@ fn log_fn_time(ccx: &@crate_ctxt, name: str, start: &time::timeval,
fn decl_fn(llmod: ModuleRef, name: &str, cc: uint, llty: TypeRef) -> fn decl_fn(llmod: ModuleRef, name: &str, cc: uint, llty: TypeRef) ->
ValueRef { ValueRef {
let llfn: ValueRef = llvm::LLVMAddFunction(llmod, str::buf(name), llty); let llfn: ValueRef = istr::as_buf(istr::from_estr(name), { |buf|
llvm::LLVMAddFunction(llmod, buf, llty)
});
llvm::LLVMSetFunctionCallConv(llfn, cc); llvm::LLVMSetFunctionCallConv(llfn, cc);
ret llfn; ret llfn;
} }
@ -335,7 +337,9 @@ fn decl_cdecl_fn(llmod: ModuleRef, name: &str, llty: TypeRef) -> ValueRef {
fn decl_fastcall_fn(llmod: ModuleRef, name: &str, llty: TypeRef) -> ValueRef { fn decl_fastcall_fn(llmod: ModuleRef, name: &str, llty: TypeRef) -> ValueRef {
let llfn = decl_fn(llmod, name, lib::llvm::LLVMFastCallConv, llty); let llfn = decl_fn(llmod, name, lib::llvm::LLVMFastCallConv, llty);
llvm::LLVMSetGC(llfn, str::buf("rust")); let _: () = istr::as_buf(~"rust", { |buf|
llvm::LLVMSetGC(llfn, buf)
});
ret llfn; ret llfn;
} }
@ -347,7 +351,9 @@ fn decl_internal_fastcall_fn(llmod: ModuleRef, name: &str, llty: TypeRef) ->
let llfn = decl_fn(llmod, name, lib::llvm::LLVMFastCallConv, llty); let llfn = decl_fn(llmod, name, lib::llvm::LLVMFastCallConv, llty);
llvm::LLVMSetLinkage(llfn, llvm::LLVMSetLinkage(llfn,
lib::llvm::LLVMInternalLinkage as llvm::Linkage); lib::llvm::LLVMInternalLinkage as llvm::Linkage);
llvm::LLVMSetGC(llfn, str::buf("rust")); let _: () = istr::as_buf(~"rust", { |buf|
llvm::LLVMSetGC(llfn, buf)
});
ret llfn; ret llfn;
} }
@ -370,7 +376,9 @@ fn get_extern_const(externs: &hashmap<istr, ValueRef>, llmod: ModuleRef,
if externs.contains_key(istr::from_estr(name)) { if externs.contains_key(istr::from_estr(name)) {
ret externs.get(istr::from_estr(name)); ret externs.get(istr::from_estr(name));
} }
let c = llvm::LLVMAddGlobal(llmod, ty, str::buf(name)); let c = istr::as_buf(istr::from_estr(name), { |buf|
llvm::LLVMAddGlobal(llmod, ty, buf)
});
externs.insert(istr::from_estr(name), c); externs.insert(istr::from_estr(name), c);
ret c; ret c;
} }
@ -1140,9 +1148,9 @@ fn declare_tydesc(cx: &@local_ctxt, sp: &span, t: ty::t, ty_params: &[uint])
name = mangle_internal_name_by_type_only(cx.ccx, t, ~"tydesc"); name = mangle_internal_name_by_type_only(cx.ccx, t, ~"tydesc");
name = sanitize(name); name = sanitize(name);
} else { name = mangle_internal_name_by_seq(cx.ccx, ~"tydesc"); } } else { name = mangle_internal_name_by_seq(cx.ccx, ~"tydesc"); }
let name = istr::to_estr(name); let gvar = istr::as_buf(name, { |buf|
let gvar = llvm::LLVMAddGlobal(ccx.llmod, ccx.tydesc_type, buf)
llvm::LLVMAddGlobal(ccx.llmod, ccx.tydesc_type, str::buf(name)); });
let info = let info =
@{ty: t, @{ty: t,
tydesc: gvar, tydesc: gvar,
@ -1575,7 +1583,9 @@ fn decr_refcnt_maybe_free(cx: &@block_ctxt, box_ptr_alias: ValueRef,
// Structural comparison: a rather involved form of glue. // Structural comparison: a rather involved form of glue.
fn maybe_name_value(cx: &@crate_ctxt, v: ValueRef, s: &str) { fn maybe_name_value(cx: &@crate_ctxt, v: ValueRef, s: &str) {
if cx.sess.get_opts().save_temps { if cx.sess.get_opts().save_temps {
llvm::LLVMSetValueName(v, str::buf(s)); let _: () = istr::as_buf(istr::from_estr(s), { |buf|
llvm::LLVMSetValueName(v, buf)
});
} }
} }
@ -3316,7 +3326,9 @@ fn lookup_discriminant(lcx: &@local_ctxt, vid: &ast::def_id) -> ValueRef {
// It's an external discriminant that we haven't seen yet. // It's an external discriminant that we haven't seen yet.
assert (vid.crate != ast::local_crate); assert (vid.crate != ast::local_crate);
let sym = csearch::get_symbol(lcx.ccx.sess.get_cstore(), vid); let sym = csearch::get_symbol(lcx.ccx.sess.get_cstore(), vid);
let gvar = llvm::LLVMAddGlobal(lcx.ccx.llmod, T_int(), str::buf(sym)); let gvar = istr::as_buf(istr::from_estr(sym), { |buf|
llvm::LLVMAddGlobal(lcx.ccx.llmod, T_int(), buf)
});
llvm::LLVMSetLinkage(gvar, llvm::LLVMSetLinkage(gvar,
lib::llvm::LLVMExternalLinkage as llvm::Linkage); lib::llvm::LLVMExternalLinkage as llvm::Linkage);
llvm::LLVMSetGlobalConstant(gvar, True); llvm::LLVMSetGlobalConstant(gvar, True);
@ -4547,8 +4559,9 @@ fn trans_log(lvl: int, cx: &@block_ctxt, e: &@ast::expr) -> result {
lcx.ccx, lcx.ccx,
istr::from_estrs(lcx.module_path), istr::from_estrs(lcx.module_path),
~"loglevel"); ~"loglevel");
let s = istr::to_estr(s); global = istr::as_buf(s, { |buf|
global = llvm::LLVMAddGlobal(lcx.ccx.llmod, T_int(), str::buf(s)); llvm::LLVMAddGlobal(lcx.ccx.llmod, T_int(), buf)
});
llvm::LLVMSetGlobalConstant(global, False); llvm::LLVMSetGlobalConstant(global, False);
llvm::LLVMSetInitializer(global, C_null(T_int())); llvm::LLVMSetInitializer(global, C_null(T_int()));
llvm::LLVMSetLinkage(global, llvm::LLVMSetLinkage(global,
@ -4911,14 +4924,14 @@ fn trans_stmt(cx: &@block_ctxt, s: &ast::stmt) -> result {
// next three functions instead. // next three functions instead.
fn new_block_ctxt(cx: &@fn_ctxt, parent: &block_parent, kind: block_kind, fn new_block_ctxt(cx: &@fn_ctxt, parent: &block_parent, kind: block_kind,
name: &str) -> @block_ctxt { name: &str) -> @block_ctxt {
let s = str::buf(""); let s = "";
let held_name; //HACK for str::buf, which doesn't keep its value alive
if cx.lcx.ccx.sess.get_opts().save_temps || if cx.lcx.ccx.sess.get_opts().save_temps ||
cx.lcx.ccx.sess.get_opts().debuginfo { cx.lcx.ccx.sess.get_opts().debuginfo {
held_name = cx.lcx.ccx.names.next(name); s = cx.lcx.ccx.names.next(name);
s = str::buf(held_name);
} }
let llbb: BasicBlockRef = llvm::LLVMAppendBasicBlock(cx.llfn, s); let llbb: BasicBlockRef = istr::as_buf(istr::from_estr(s), { |buf|
llvm::LLVMAppendBasicBlock(cx.llfn, buf)
});
ret @{llbb: llbb, ret @{llbb: llbb,
mutable terminated: false, mutable terminated: false,
parent: parent, parent: parent,
@ -5073,8 +5086,9 @@ fn alloc_local(cx: &@block_ctxt, local: &@ast::local) -> result {
alt local.node.pat.node { alt local.node.pat.node {
ast::pat_bind(ident) { ast::pat_bind(ident) {
if bcx_ccx(cx).sess.get_opts().debuginfo { if bcx_ccx(cx).sess.get_opts().debuginfo {
let ident = istr::to_estr(ident); let _: () = istr::as_buf(ident, { |buf|
llvm::LLVMSetValueName(r.val, str::buf(ident)); llvm::LLVMSetValueName(r.val, buf)
});
} }
} }
_ { } _ { }
@ -5158,11 +5172,21 @@ fn mk_standard_basic_blocks(llfn: ValueRef) ->
dt: BasicBlockRef, dt: BasicBlockRef,
da: BasicBlockRef, da: BasicBlockRef,
rt: BasicBlockRef} { rt: BasicBlockRef} {
ret {sa: llvm::LLVMAppendBasicBlock(llfn, str::buf("static_allocas")), ret {sa: istr::as_buf(~"statuc_allocas", { |buf|
ca: llvm::LLVMAppendBasicBlock(llfn, str::buf("copy_args")), llvm::LLVMAppendBasicBlock(llfn, buf)
dt: llvm::LLVMAppendBasicBlock(llfn, str::buf("derived_tydescs")), }),
da: llvm::LLVMAppendBasicBlock(llfn, str::buf("dynamic_allocas")), ca: istr::as_buf(~"copy_args", { |buf|
rt: llvm::LLVMAppendBasicBlock(llfn, str::buf("return"))}; llvm::LLVMAppendBasicBlock(llfn, buf)
}),
dt: istr::as_buf(~"derived_tydescs", { |buf|
llvm::LLVMAppendBasicBlock(llfn, buf)
}),
da: istr::as_buf(~"dynamic_allocas", { |buf|
llvm::LLVMAppendBasicBlock(llfn, buf)
}),
rt: istr::as_buf(~"return", { |buf|
llvm::LLVMAppendBasicBlock(llfn, buf)
})};
} }
@ -5796,8 +5820,9 @@ fn create_main_wrapper(ccx: &@crate_ctxt, sp: &span, main_llfn: ValueRef,
// space for the function's environment. // space for the function's environment.
fn create_fn_pair(cx: &@crate_ctxt, ps: str, llfnty: TypeRef, llfn: ValueRef, fn create_fn_pair(cx: &@crate_ctxt, ps: str, llfnty: TypeRef, llfn: ValueRef,
external: bool) -> ValueRef { external: bool) -> ValueRef {
let gvar = let gvar = istr::as_buf(istr::from_estr(ps), { |buf|
llvm::LLVMAddGlobal(cx.llmod, T_fn_pair(*cx, llfnty), str::buf(ps)); llvm::LLVMAddGlobal(cx.llmod, T_fn_pair(*cx, llfnty), buf)
});
let pair = C_struct([llfn, C_null(T_opaque_closure_ptr(*cx))]); let pair = C_struct([llfn, C_null(T_opaque_closure_ptr(*cx))]);
llvm::LLVMSetInitializer(gvar, pair); llvm::LLVMSetInitializer(gvar, pair);
llvm::LLVMSetGlobalConstant(gvar, True); llvm::LLVMSetGlobalConstant(gvar, True);
@ -6072,11 +6097,10 @@ fn collect_item_1(ccx: @crate_ctxt, i: &@ast::item, pt: &[str],
let s = let s =
mangle_exported_name(ccx, istr::from_estrs(pt) + [i.ident], mangle_exported_name(ccx, istr::from_estrs(pt) + [i.ident],
node_id_type(ccx, i.id)); node_id_type(ccx, i.id));
let s = istr::to_estr(s); let g = istr::as_buf(s, { |buf|
let g = llvm::LLVMAddGlobal(ccx.llmod, type_of(ccx, i.span, typ), buf)
llvm::LLVMAddGlobal(ccx.llmod, type_of(ccx, i.span, typ), });
str::buf(s)); ccx.item_symbols.insert(i.id, istr::to_estr(s));
ccx.item_symbols.insert(i.id, s);
ccx.consts.insert(i.id, g); ccx.consts.insert(i.id, g);
} }
_ { } _ { }
@ -6165,15 +6189,15 @@ fn trans_constant(ccx: @crate_ctxt, it: &@ast::item, pt: &[str],
~"discrim"]; ~"discrim"];
let s = mangle_exported_name(ccx, p, let s = mangle_exported_name(ccx, p,
ty::mk_int(ccx.tcx)); ty::mk_int(ccx.tcx));
let s = istr::to_estr(s); let discrim_gvar = istr::as_buf(s, { |buf|
let discrim_gvar = llvm::LLVMAddGlobal(ccx.llmod, T_int(), buf)
llvm::LLVMAddGlobal(ccx.llmod, T_int(), str::buf(s)); });
if n_variants != 1u { if n_variants != 1u {
llvm::LLVMSetInitializer(discrim_gvar, C_int(i as int)); llvm::LLVMSetInitializer(discrim_gvar, C_int(i as int));
llvm::LLVMSetGlobalConstant(discrim_gvar, True); llvm::LLVMSetGlobalConstant(discrim_gvar, True);
} }
ccx.discrims.insert(variant.node.id, discrim_gvar); ccx.discrims.insert(variant.node.id, discrim_gvar);
ccx.discrim_symbols.insert(variant.node.id, s); ccx.discrim_symbols.insert(variant.node.id, istr::to_estr(s));
i += 1u; i += 1u;
} }
} }
@ -6272,20 +6296,21 @@ fn make_common_glue(sess: &session::session, output: &str) {
let task_type = T_task(); let task_type = T_task();
let taskptr_type = T_ptr(task_type); let taskptr_type = T_ptr(task_type);
let llmod = let llmod = istr::as_buf(~"rust_out", { |buf|
llvm::LLVMModuleCreateWithNameInContext(str::buf("rust_out"), llvm::LLVMModuleCreateWithNameInContext(buf,
llvm::LLVMGetGlobalContext()); llvm::LLVMGetGlobalContext())
let dat_layt = istr::to_estr( });
x86::get_data_layout()); //HACK (buf lifetime issue) let _: () = istr::as_buf(x86::get_data_layout(), { |buf|
llvm::LLVMSetDataLayout(llmod, str::buf(dat_layt)); llvm::LLVMSetDataLayout(llmod, buf)
let targ_trip = istr::to_estr( });
x86::get_target_triple()); //HACK (buf lifetime issue) let _: () = istr::as_buf(x86::get_target_triple(), { |buf|
llvm::LLVMSetTarget(llmod, str::buf(targ_trip)); llvm::LLVMSetTarget(llmod, buf)
});
mk_target_data(istr::to_estr(x86::get_data_layout())); mk_target_data(istr::to_estr(x86::get_data_layout()));
declare_intrinsics(llmod); declare_intrinsics(llmod);
let modl_asm = istr::to_estr( let _: () = istr::as_buf(x86::get_module_asm(), { |buf|
x86::get_module_asm()); //HACK (buf lifetime issue) llvm::LLVMSetModuleInlineAsm(llmod, buf)
llvm::LLVMSetModuleInlineAsm(llmod, str::buf(modl_asm)); });
make_glues(llmod, taskptr_type); make_glues(llmod, taskptr_type);
link::write::run_passes(sess, llmod, istr::from_estr(output)); link::write::run_passes(sess, llmod, istr::from_estr(output));
} }
@ -6293,8 +6318,9 @@ fn make_common_glue(sess: &session::session, output: &str) {
fn create_module_map(ccx: &@crate_ctxt) -> ValueRef { fn create_module_map(ccx: &@crate_ctxt) -> ValueRef {
let elttype = T_struct([T_int(), T_int()]); let elttype = T_struct([T_int(), T_int()]);
let maptype = T_array(elttype, ccx.module_data.size() + 1u); let maptype = T_array(elttype, ccx.module_data.size() + 1u);
let map = let map = istr::as_buf(~"_rust_mod_map", { |buf|
llvm::LLVMAddGlobal(ccx.llmod, maptype, str::buf("_rust_mod_map")); llvm::LLVMAddGlobal(ccx.llmod, maptype, buf)
});
llvm::LLVMSetLinkage(map, llvm::LLVMSetLinkage(map,
lib::llvm::LLVMInternalLinkage as llvm::Linkage); lib::llvm::LLVMInternalLinkage as llvm::Linkage);
let elts: [ValueRef] = []; let elts: [ValueRef] = [];
@ -6317,7 +6343,9 @@ fn create_crate_map(ccx: &@crate_ctxt) -> ValueRef {
let cstore = ccx.sess.get_cstore(); let cstore = ccx.sess.get_cstore();
while cstore::have_crate_data(cstore, i) { while cstore::have_crate_data(cstore, i) {
let nm = "_rust_crate_map_" + cstore::get_crate_data(cstore, i).name; let nm = "_rust_crate_map_" + cstore::get_crate_data(cstore, i).name;
let cr = llvm::LLVMAddGlobal(ccx.llmod, T_int(), str::buf(nm)); let cr = istr::as_buf(istr::from_estr(nm), { |buf|
llvm::LLVMAddGlobal(ccx.llmod, T_int(), buf)
});
subcrates += [p2i(cr)]; subcrates += [p2i(cr)];
i += 1; i += 1;
} }
@ -6326,10 +6354,12 @@ fn create_crate_map(ccx: &@crate_ctxt) -> ValueRef {
if ccx.sess.get_opts().library { if ccx.sess.get_opts().library {
mapname = ccx.link_meta.name; mapname = ccx.link_meta.name;
} else { mapname = ~"toplevel"; } } else { mapname = ~"toplevel"; }
let sym_name = istr::to_estr(~"_rust_crate_map_" + mapname); let sym_name = ~"_rust_crate_map_" + mapname;
let arrtype = T_array(T_int(), std::vec::len::<ValueRef>(subcrates)); let arrtype = T_array(T_int(), std::vec::len::<ValueRef>(subcrates));
let maptype = T_struct([T_int(), arrtype]); let maptype = T_struct([T_int(), arrtype]);
let map = llvm::LLVMAddGlobal(ccx.llmod, maptype, str::buf(sym_name)); let map = istr::as_buf(sym_name, { |buf|
llvm::LLVMAddGlobal(ccx.llmod, maptype, buf)
});
llvm::LLVMSetLinkage(map, llvm::LLVMSetLinkage(map,
lib::llvm::LLVMExternalLinkage as llvm::Linkage); lib::llvm::LLVMExternalLinkage as llvm::Linkage);
llvm::LLVMSetInitializer(map, llvm::LLVMSetInitializer(map,
@ -6342,21 +6372,21 @@ fn write_metadata(cx: &@crate_ctxt, crate: &@ast::crate) {
if !cx.sess.get_opts().library { ret; } if !cx.sess.get_opts().library { ret; }
let llmeta = C_postr(metadata::encoder::encode_metadata(cx, crate)); let llmeta = C_postr(metadata::encoder::encode_metadata(cx, crate));
let llconst = trans_common::C_struct([llmeta]); let llconst = trans_common::C_struct([llmeta]);
let llglobal = let llglobal = istr::as_buf(~"rust_metadata", { |buf|
llvm::LLVMAddGlobal(cx.llmod, val_ty(llconst), llvm::LLVMAddGlobal(cx.llmod, val_ty(llconst), buf)
str::buf("rust_metadata")); });
llvm::LLVMSetInitializer(llglobal, llconst); llvm::LLVMSetInitializer(llglobal, llconst);
let met_sct_nm = istr::to_estr( let _: () = istr::as_buf(x86::get_meta_sect_name(), { |buf|
x86::get_meta_sect_name()); //HACK (buf lifetime issue) llvm::LLVMSetSection(llglobal, buf)
llvm::LLVMSetSection(llglobal, str::buf(met_sct_nm)); });
llvm::LLVMSetLinkage(llglobal, llvm::LLVMSetLinkage(llglobal,
lib::llvm::LLVMInternalLinkage as llvm::Linkage); lib::llvm::LLVMInternalLinkage as llvm::Linkage);
let t_ptr_i8 = T_ptr(T_i8()); let t_ptr_i8 = T_ptr(T_i8());
llglobal = llvm::LLVMConstBitCast(llglobal, t_ptr_i8); llglobal = llvm::LLVMConstBitCast(llglobal, t_ptr_i8);
let llvm_used = let llvm_used = istr::as_buf(~"llvm.used", { |buf|
llvm::LLVMAddGlobal(cx.llmod, T_array(t_ptr_i8, 1u), llvm::LLVMAddGlobal(cx.llmod, T_array(t_ptr_i8, 1u), buf)
str::buf("llvm.used")); });
llvm::LLVMSetLinkage(llvm_used, llvm::LLVMSetLinkage(llvm_used,
lib::llvm::LLVMAppendingLinkage as llvm::Linkage); lib::llvm::LLVMAppendingLinkage as llvm::Linkage);
llvm::LLVMSetInitializer(llvm_used, C_array(t_ptr_i8, [llglobal])); llvm::LLVMSetInitializer(llvm_used, C_array(t_ptr_i8, [llglobal]));
@ -6371,16 +6401,17 @@ fn write_abi_version(ccx: &@crate_ctxt) {
fn trans_crate(sess: &session::session, crate: &@ast::crate, tcx: &ty::ctxt, fn trans_crate(sess: &session::session, crate: &@ast::crate, tcx: &ty::ctxt,
output: &str, amap: &ast_map::map, mut_map: alias::mut_map) output: &str, amap: &ast_map::map, mut_map: alias::mut_map)
-> ModuleRef { -> ModuleRef {
let llmod = let llmod = istr::as_buf(~"rust_out", { |buf|
llvm::LLVMModuleCreateWithNameInContext(str::buf("rust_out"), llvm::LLVMModuleCreateWithNameInContext(buf,
llvm::LLVMGetGlobalContext()); llvm::LLVMGetGlobalContext())
let dat_layt = istr::to_estr( });
x86::get_data_layout()); //HACK (buf lifetime issue) let _: () = istr::as_buf(x86::get_data_layout(), { |buf|
llvm::LLVMSetDataLayout(llmod, str::buf(dat_layt)); llvm::LLVMSetDataLayout(llmod, buf)
let targ_trip = istr::to_estr( });
x86::get_target_triple()); //HACK (buf lifetime issue) let _: () = istr::as_buf(x86::get_target_triple(), { |buf|
llvm::LLVMSetTarget(llmod, str::buf(targ_trip)); llvm::LLVMSetTarget(llmod, buf)
let td = mk_target_data(dat_layt); });
let td = mk_target_data(istr::to_estr(x86::get_data_layout()));
let tn = mk_type_names(); let tn = mk_type_names();
let intrinsics = declare_intrinsics(llmod); let intrinsics = declare_intrinsics(llmod);
let task_type = T_task(); let task_type = T_task();

View file

@ -1,5 +1,5 @@
import std::{vec, str}; import std::{vec, str, istr};
import str::rustrt::sbuf; import std::istr::sbuf;
import lib::llvm::llvm; import lib::llvm::llvm;
import llvm::{ValueRef, TypeRef, BasicBlockRef, BuilderRef, import llvm::{ValueRef, TypeRef, BasicBlockRef, BuilderRef,
Opcode, ModuleRef}; Opcode, ModuleRef};
@ -71,8 +71,10 @@ fn Invoke(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef],
cx.terminated = true; cx.terminated = true;
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildInvoke(B, Fn, vec::to_ptr(Args), ret istr::as_buf(~"", { |buf|
vec::len(Args), Then, Catch, str::buf("")); llvm::LLVMBuildInvoke(B, Fn, vec::to_ptr(Args),
vec::len(Args), Then, Catch, buf)
});
} }
fn Unreachable(cx: &@block_ctxt) -> ValueRef { fn Unreachable(cx: &@block_ctxt) -> ValueRef {
@ -87,211 +89,282 @@ fn Unreachable(cx: &@block_ctxt) -> ValueRef {
fn Add(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn Add(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildAdd(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildAdd(B, LHS, RHS, buf)
});
} }
fn NSWAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn NSWAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildNSWAdd(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildNSWAdd(B, LHS, RHS, buf)
});
} }
fn NUWAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn NUWAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildNUWAdd(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildNUWAdd(B, LHS, RHS, buf)
});
} }
fn FAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn FAdd(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFAdd(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFAdd(B, LHS, RHS, buf)
});
} }
fn Sub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn Sub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildSub(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildSub(B, LHS, RHS, buf)
});
} }
fn NSWSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn NSWSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildNSWSub(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildNSWSub(B, LHS, RHS, buf)
});
} }
fn NUWSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn NUWSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildNUWSub(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildNUWSub(B, LHS, RHS, buf)
});
} }
fn FSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn FSub(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFSub(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFSub(B, LHS, RHS, buf)
});
} }
fn Mul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn Mul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildMul(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildMul(B, LHS, RHS, buf)
});
} }
fn NSWMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn NSWMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildNSWMul(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildNSWMul(B, LHS, RHS, buf)
});
} }
fn NUWMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn NUWMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildNUWMul(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildNUWMul(B, LHS, RHS, buf)
});
} }
fn FMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn FMul(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFMul(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFMul(B, LHS, RHS, buf)
});
} }
fn UDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn UDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildUDiv(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildUDiv(B, LHS, RHS, buf)
});
} }
fn SDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn SDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildSDiv(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildSDiv(B, LHS, RHS, buf)
});
} }
fn ExactSDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn ExactSDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildExactSDiv(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildExactSDiv(B, LHS, RHS, buf)
});
} }
fn FDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn FDiv(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFDiv(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFDiv(B, LHS, RHS, buf)
});
} }
fn URem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn URem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildURem(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildURem(B, LHS, RHS, buf)
});
} }
fn SRem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn SRem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildSRem(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildSRem(B, LHS, RHS, buf)
});
} }
fn FRem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn FRem(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFRem(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFRem(B, LHS, RHS, buf)
});
} }
fn Shl(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn Shl(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildShl(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildShl(B, LHS, RHS, buf)
});
} }
fn LShr(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn LShr(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildLShr(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildLShr(B, LHS, RHS, buf)
});
} }
fn AShr(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn AShr(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildAShr(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildAShr(B, LHS, RHS, buf)
});
} }
fn And(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn And(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildAnd(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildAnd(B, LHS, RHS, buf)
});
} }
fn Or(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn Or(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildOr(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildOr(B, LHS, RHS, buf)
});
} }
fn Xor(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn Xor(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildXor(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildXor(B, LHS, RHS, buf)
});
} }
fn BinOp(cx: &@block_ctxt, Op: Opcode, LHS: ValueRef, fn BinOp(cx: &@block_ctxt, Op: Opcode, LHS: ValueRef,
RHS: ValueRef) -> ValueRef { RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildBinOp(B, Op, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildBinOp(B, Op, LHS, RHS, buf)
});
} }
fn Neg(cx: &@block_ctxt, V: ValueRef) -> ValueRef { fn Neg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildNeg(B, V, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildNeg(B, V, buf)
});
} }
fn NSWNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef { fn NSWNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildNSWNeg(B, V, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildNSWNeg(B, V, buf)
});
} }
fn NUWNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef { fn NUWNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildNUWNeg(B, V, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildNUWNeg(B, V, buf)
});
} }
fn FNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef { fn FNeg(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFNeg(B, V, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFNeg(B, V, buf)
});
} }
fn Not(cx: &@block_ctxt, V: ValueRef) -> ValueRef { fn Not(cx: &@block_ctxt, V: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildNot(B, V, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildNot(B, V, buf)
});
} }
/* Memory */ /* Memory */
fn Malloc(cx: &@block_ctxt, Ty: TypeRef) -> ValueRef { fn Malloc(cx: &@block_ctxt, Ty: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildMalloc(B, Ty, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildMalloc(B, Ty, buf)
});
} }
fn ArrayMalloc(cx: &@block_ctxt, Ty: TypeRef, Val: ValueRef) -> ValueRef { fn ArrayMalloc(cx: &@block_ctxt, Ty: TypeRef, Val: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildArrayMalloc(B, Ty, Val, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildArrayMalloc(B, Ty, Val, buf)
});
} }
fn Alloca(cx: &@block_ctxt, Ty: TypeRef) -> ValueRef { fn Alloca(cx: &@block_ctxt, Ty: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildAlloca(B, Ty, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildAlloca(B, Ty, buf)
});
} }
fn ArrayAlloca(cx: &@block_ctxt, Ty: TypeRef, Val: ValueRef) -> ValueRef { fn ArrayAlloca(cx: &@block_ctxt, Ty: TypeRef, Val: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildArrayAlloca(B, Ty, Val, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildArrayAlloca(B, Ty, Val, buf)
});
} }
fn Free(cx: &@block_ctxt, PointerVal: ValueRef) -> ValueRef { fn Free(cx: &@block_ctxt, PointerVal: ValueRef) -> ValueRef {
@ -303,7 +376,9 @@ fn Free(cx: &@block_ctxt, PointerVal: ValueRef) -> ValueRef {
fn Load(cx: &@block_ctxt, PointerVal: ValueRef) -> ValueRef { fn Load(cx: &@block_ctxt, PointerVal: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildLoad(B, PointerVal, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildLoad(B, PointerVal, buf)
});
} }
fn Store(cx: &@block_ctxt, Val: ValueRef, Ptr: ValueRef) -> ValueRef { fn Store(cx: &@block_ctxt, Val: ValueRef, Ptr: ValueRef) -> ValueRef {
@ -316,130 +391,170 @@ fn GEP(cx: &@block_ctxt, Pointer: ValueRef,
Indices: &[ValueRef]) -> ValueRef { Indices: &[ValueRef]) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildGEP(B, Pointer, vec::to_ptr(Indices), ret istr::as_buf(~"", { |buf|
vec::len(Indices), str::buf("")); llvm::LLVMBuildGEP(B, Pointer, vec::to_ptr(Indices),
vec::len(Indices), buf)
});
} }
fn InBoundsGEP(cx: &@block_ctxt, Pointer: ValueRef, fn InBoundsGEP(cx: &@block_ctxt, Pointer: ValueRef,
Indices: &[ValueRef]) -> ValueRef { Indices: &[ValueRef]) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildInBoundsGEP(B, Pointer, vec::to_ptr(Indices), ret istr::as_buf(~"", { |buf|
vec::len(Indices), str::buf("")); llvm::LLVMBuildInBoundsGEP(B, Pointer, vec::to_ptr(Indices),
vec::len(Indices), buf)
});
} }
fn StructGEP(cx: &@block_ctxt, Pointer: ValueRef, Idx: uint) -> ValueRef { fn StructGEP(cx: &@block_ctxt, Pointer: ValueRef, Idx: uint) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildStructGEP(B, Pointer, Idx, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildStructGEP(B, Pointer, Idx, buf)
});
} }
fn GlobalString(cx: &@block_ctxt, _Str: sbuf) -> ValueRef { fn GlobalString(cx: &@block_ctxt, _Str: sbuf) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildGlobalString(B, _Str, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildGlobalString(B, _Str, buf)
});
} }
fn GlobalStringPtr(cx: &@block_ctxt, _Str: sbuf) -> ValueRef { fn GlobalStringPtr(cx: &@block_ctxt, _Str: sbuf) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildGlobalStringPtr(B, _Str, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildGlobalStringPtr(B, _Str, buf)
});
} }
/* Casts */ /* Casts */
fn Trunc(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn Trunc(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildTrunc(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildTrunc(B, Val, DestTy, buf)
});
} }
fn ZExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn ZExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildZExt(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildZExt(B, Val, DestTy, buf)
});
} }
fn SExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn SExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildSExt(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildSExt(B, Val, DestTy, buf)
});
} }
fn FPToUI(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn FPToUI(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFPToUI(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFPToUI(B, Val, DestTy, buf)
});
} }
fn FPToSI(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn FPToSI(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFPToSI(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFPToSI(B, Val, DestTy, buf)
});
} }
fn UIToFP(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn UIToFP(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildUIToFP(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildUIToFP(B, Val, DestTy, buf)
});
} }
fn SIToFP(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn SIToFP(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildSIToFP(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildSIToFP(B, Val, DestTy, buf)
});
} }
fn FPTrunc(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn FPTrunc(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFPTrunc(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFPTrunc(B, Val, DestTy, buf)
});
} }
fn FPExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn FPExt(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFPExt(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFPExt(B, Val, DestTy, buf)
});
} }
fn PtrToInt(cx: &@block_ctxt, Val: ValueRef, fn PtrToInt(cx: &@block_ctxt, Val: ValueRef,
DestTy: TypeRef) -> ValueRef { DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildPtrToInt(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildPtrToInt(B, Val, DestTy, buf)
});
} }
fn IntToPtr(cx: &@block_ctxt, Val: ValueRef, fn IntToPtr(cx: &@block_ctxt, Val: ValueRef,
DestTy: TypeRef) -> ValueRef { DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildIntToPtr(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildIntToPtr(B, Val, DestTy, buf)
});
} }
fn BitCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn BitCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildBitCast(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildBitCast(B, Val, DestTy, buf)
});
} }
fn ZExtOrBitCast(cx: &@block_ctxt, Val: ValueRef, fn ZExtOrBitCast(cx: &@block_ctxt, Val: ValueRef,
DestTy: TypeRef) -> ValueRef { DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildZExtOrBitCast(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildZExtOrBitCast(B, Val, DestTy, buf)
});
} }
fn SExtOrBitCast(cx: &@block_ctxt, Val: ValueRef, fn SExtOrBitCast(cx: &@block_ctxt, Val: ValueRef,
DestTy: TypeRef) -> ValueRef { DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildSExtOrBitCast(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildSExtOrBitCast(B, Val, DestTy, buf)
});
} }
fn TruncOrBitCast(cx: &@block_ctxt, Val: ValueRef, fn TruncOrBitCast(cx: &@block_ctxt, Val: ValueRef,
DestTy: TypeRef) -> ValueRef { DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildTruncOrBitCast(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildTruncOrBitCast(B, Val, DestTy, buf)
});
} }
fn Cast(cx: &@block_ctxt, Op: Opcode, Val: ValueRef, fn Cast(cx: &@block_ctxt, Op: Opcode, Val: ValueRef,
@ -447,25 +562,33 @@ fn Cast(cx: &@block_ctxt, Op: Opcode, Val: ValueRef,
ValueRef { ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildCast(B, Op, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildCast(B, Op, Val, DestTy, buf)
});
} }
fn PointerCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn PointerCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildPointerCast(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildPointerCast(B, Val, DestTy, buf)
});
} }
fn IntCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn IntCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildIntCast(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildIntCast(B, Val, DestTy, buf)
});
} }
fn FPCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef { fn FPCast(cx: &@block_ctxt, Val: ValueRef, DestTy: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFPCast(B, Val, DestTy, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFPCast(B, Val, DestTy, buf)
});
} }
@ -474,14 +597,18 @@ fn ICmp(cx: &@block_ctxt, Op: uint, LHS: ValueRef,
RHS: ValueRef) -> ValueRef { RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildICmp(B, Op, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildICmp(B, Op, LHS, RHS, buf)
});
} }
fn FCmp(cx: &@block_ctxt, Op: uint, LHS: ValueRef, fn FCmp(cx: &@block_ctxt, Op: uint, LHS: ValueRef,
RHS: ValueRef) -> ValueRef { RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildFCmp(B, Op, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildFCmp(B, Op, LHS, RHS, buf)
});
} }
@ -490,7 +617,9 @@ fn Phi(cx: &@block_ctxt, Ty: TypeRef, vals: &[ValueRef],
bbs: &[BasicBlockRef]) -> ValueRef { bbs: &[BasicBlockRef]) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
let phi = llvm::LLVMBuildPhi(B, Ty, str::buf("")); let phi = istr::as_buf(~"", { |buf|
llvm::LLVMBuildPhi(B, Ty, buf)
});
assert (vec::len::<ValueRef>(vals) == vec::len::<BasicBlockRef>(bbs)); assert (vec::len::<ValueRef>(vals) == vec::len::<BasicBlockRef>(bbs));
llvm::LLVMAddIncoming(phi, vec::to_ptr(vals), vec::to_ptr(bbs), llvm::LLVMAddIncoming(phi, vec::to_ptr(vals), vec::to_ptr(bbs),
vec::len(vals)); vec::len(vals));
@ -506,16 +635,18 @@ fn AddIncomingToPhi(phi: ValueRef, vals: &[ValueRef], bbs: &[BasicBlockRef]) {
fn Call(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef]) -> ValueRef { fn Call(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef]) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args), vec::len(Args), ret istr::as_buf(~"", { |buf|
str::buf("")); llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args),
vec::len(Args), buf)
});
} }
fn FastCall(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef]) -> ValueRef { fn FastCall(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef]) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
let v = let v = istr::as_buf(~"", { |buf|
llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args), vec::len(Args), llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args), vec::len(Args), buf)
str::buf("")); });
llvm::LLVMSetInstructionCallConv(v, lib::llvm::LLVMFastCallConv); llvm::LLVMSetInstructionCallConv(v, lib::llvm::LLVMFastCallConv);
ret v; ret v;
} }
@ -524,9 +655,9 @@ fn CallWithConv(cx: &@block_ctxt, Fn: ValueRef, Args: &[ValueRef],
Conv: uint) -> ValueRef { Conv: uint) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
let v = let v = istr::as_buf(~"", { |buf|
llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args), vec::len(Args), llvm::LLVMBuildCall(B, Fn, vec::to_ptr(Args), vec::len(Args), buf)
str::buf("")); });
llvm::LLVMSetInstructionCallConv(v, Conv); llvm::LLVMSetInstructionCallConv(v, Conv);
ret v; ret v;
} }
@ -535,20 +666,26 @@ fn Select(cx: &@block_ctxt, If: ValueRef, Then: ValueRef,
Else: ValueRef) -> ValueRef { Else: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildSelect(B, If, Then, Else, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildSelect(B, If, Then, Else, buf)
});
} }
fn VAArg(cx: &@block_ctxt, list: ValueRef, Ty: TypeRef) -> ValueRef { fn VAArg(cx: &@block_ctxt, list: ValueRef, Ty: TypeRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildVAArg(B, list, Ty, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildVAArg(B, list, Ty, buf)
});
} }
fn ExtractElement(cx: &@block_ctxt, VecVal: ValueRef, fn ExtractElement(cx: &@block_ctxt, VecVal: ValueRef,
Index: ValueRef) -> ValueRef { Index: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildExtractElement(B, VecVal, Index, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildExtractElement(B, VecVal, Index, buf)
});
} }
fn InsertElement(cx: &@block_ctxt, VecVal: ValueRef, EltVal: ValueRef, fn InsertElement(cx: &@block_ctxt, VecVal: ValueRef, EltVal: ValueRef,
@ -556,47 +693,59 @@ fn InsertElement(cx: &@block_ctxt, VecVal: ValueRef, EltVal: ValueRef,
ValueRef { ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildInsertElement(B, VecVal, EltVal, Index, ret istr::as_buf(~"", { |buf|
str::buf("")); llvm::LLVMBuildInsertElement(B, VecVal, EltVal, Index, buf)
});
} }
fn ShuffleVector(cx: &@block_ctxt, V1: ValueRef, V2: ValueRef, fn ShuffleVector(cx: &@block_ctxt, V1: ValueRef, V2: ValueRef,
Mask: ValueRef) -> ValueRef { Mask: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildShuffleVector(B, V1, V2, Mask, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildShuffleVector(B, V1, V2, Mask, buf)
});
} }
fn ExtractValue(cx: &@block_ctxt, AggVal: ValueRef, Index: uint) -> ValueRef { fn ExtractValue(cx: &@block_ctxt, AggVal: ValueRef, Index: uint) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildExtractValue(B, AggVal, Index, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildExtractValue(B, AggVal, Index, buf)
});
} }
fn InsertValue(cx: &@block_ctxt, AggVal: ValueRef, fn InsertValue(cx: &@block_ctxt, AggVal: ValueRef,
EltVal: ValueRef, Index: uint) -> ValueRef { EltVal: ValueRef, Index: uint) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildInsertValue(B, AggVal, EltVal, Index, ret istr::as_buf(~"", { |buf|
str::buf("")); llvm::LLVMBuildInsertValue(B, AggVal, EltVal, Index, buf)
});
} }
fn IsNull(cx: &@block_ctxt, Val: ValueRef) -> ValueRef { fn IsNull(cx: &@block_ctxt, Val: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildIsNull(B, Val, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildIsNull(B, Val, buf)
});
} }
fn IsNotNull(cx: &@block_ctxt, Val: ValueRef) -> ValueRef { fn IsNotNull(cx: &@block_ctxt, Val: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildIsNotNull(B, Val, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildIsNotNull(B, Val, buf)
});
} }
fn PtrDiff(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef { fn PtrDiff(cx: &@block_ctxt, LHS: ValueRef, RHS: ValueRef) -> ValueRef {
let B = *cx.fcx.lcx.ccx.builder; let B = *cx.fcx.lcx.ccx.builder;
llvm::LLVMPositionBuilderAtEnd(B, cx.llbb); llvm::LLVMPositionBuilderAtEnd(B, cx.llbb);
ret llvm::LLVMBuildPtrDiff(B, LHS, RHS, str::buf("")); ret istr::as_buf(~"", { |buf|
llvm::LLVMBuildPtrDiff(B, LHS, RHS, buf)
});
} }
fn Trap(cx: &@block_ctxt) -> ValueRef { fn Trap(cx: &@block_ctxt) -> ValueRef {
@ -605,12 +754,14 @@ fn Trap(cx: &@block_ctxt) -> ValueRef {
let BB: BasicBlockRef = llvm::LLVMGetInsertBlock(B); let BB: BasicBlockRef = llvm::LLVMGetInsertBlock(B);
let FN: ValueRef = llvm::LLVMGetBasicBlockParent(BB); let FN: ValueRef = llvm::LLVMGetBasicBlockParent(BB);
let M: ModuleRef = llvm::LLVMGetGlobalParent(FN); let M: ModuleRef = llvm::LLVMGetGlobalParent(FN);
let T: ValueRef = let T: ValueRef = istr::as_buf(~"llvm.trap", { |buf|
llvm::LLVMGetNamedFunction(M, str::buf("llvm.trap")); llvm::LLVMGetNamedFunction(M, buf)
});
assert (T as int != 0); assert (T as int != 0);
let Args: [ValueRef] = []; let Args: [ValueRef] = [];
ret llvm::LLVMBuildCall(B, T, vec::to_ptr(Args), vec::len(Args), ret istr::as_buf(~"", { |buf|
str::buf("")); llvm::LLVMBuildCall(B, T, vec::to_ptr(Args), vec::len(Args), buf)
});
} }
// //

View file

@ -553,7 +553,9 @@ fn T_struct(elts: &[TypeRef]) -> TypeRef {
fn T_named_struct(name: &str) -> TypeRef { fn T_named_struct(name: &str) -> TypeRef {
let c = llvm::LLVMGetGlobalContext(); let c = llvm::LLVMGetGlobalContext();
ret llvm::LLVMStructCreateNamed(c, str::buf(name)); ret istr::as_buf(istr::from_estr(name), { |buf|
llvm::LLVMStructCreateNamed(c, buf)
});
} }
fn set_struct_body(t: TypeRef, elts: &[TypeRef]) { fn set_struct_body(t: TypeRef, elts: &[TypeRef]) {
@ -816,11 +818,15 @@ fn C_integral(t: TypeRef, u: uint, sign_extend: Bool) -> ValueRef {
} }
fn C_float(s: &str) -> ValueRef { fn C_float(s: &str) -> ValueRef {
ret llvm::LLVMConstRealOfString(T_float(), str::buf(s)); ret istr::as_buf(istr::from_estr(s), { |buf|
llvm::LLVMConstRealOfString(T_float(), buf)
});
} }
fn C_floating(s: &str, t: TypeRef) -> ValueRef { fn C_floating(s: &str, t: TypeRef) -> ValueRef {
ret llvm::LLVMConstRealOfString(t, str::buf(s)); ret istr::as_buf(istr::from_estr(s), { |buf|
llvm::LLVMConstRealOfString(t, buf)
});
} }
fn C_nil() -> ValueRef { fn C_nil() -> ValueRef {
@ -845,11 +851,12 @@ fn C_u8(i: uint) -> ValueRef { ret C_integral(T_i8(), i, False); }
// This is a 'c-like' raw string, which differs from // This is a 'c-like' raw string, which differs from
// our boxed-and-length-annotated strings. // our boxed-and-length-annotated strings.
fn C_cstr(cx: &@crate_ctxt, s: &str) -> ValueRef { fn C_cstr(cx: &@crate_ctxt, s: &str) -> ValueRef {
let sc = llvm::LLVMConstString(str::buf(s), str::byte_len(s), False); let sc = istr::as_buf(istr::from_estr(s), { |buf|
let gname = cx.names.next("str"); llvm::LLVMConstString(buf, str::byte_len(s), False)
let g = });
llvm::LLVMAddGlobal(cx.llmod, val_ty(sc), let g = istr::as_buf(istr::from_estr(cx.names.next("str")), { |buf|
str::buf(gname)); llvm::LLVMAddGlobal(cx.llmod, val_ty(sc), buf)
});
llvm::LLVMSetInitializer(g, sc); llvm::LLVMSetInitializer(g, sc);
llvm::LLVMSetGlobalConstant(g, True); llvm::LLVMSetGlobalConstant(g, True);
llvm::LLVMSetLinkage(g, lib::llvm::LLVMInternalLinkage as llvm::Linkage); llvm::LLVMSetLinkage(g, lib::llvm::LLVMInternalLinkage as llvm::Linkage);
@ -864,13 +871,15 @@ fn C_str(cx: &@crate_ctxt, s: &str) -> ValueRef {
// 'fill' // 'fill'
// 'pad' // 'pad'
let cstr = istr::as_buf(istr::from_estr(s), { |buf|
llvm::LLVMConstString(buf, len, False)
});
let box = let box =
C_struct([C_int(abi::const_refcount as int), C_int(len + 1u as int), C_struct([C_int(abi::const_refcount as int), C_int(len + 1u as int),
C_int(len + 1u as int), C_int(0), C_int(len + 1u as int), C_int(0), cstr]);
llvm::LLVMConstString(str::buf(s), len, False)]); let g = istr::as_buf(istr::from_estr(cx.names.next("str")), { |buf|
let gname = cx.names.next("str"); llvm::LLVMAddGlobal(cx.llmod, val_ty(box), buf)
let g = });
llvm::LLVMAddGlobal(cx.llmod, val_ty(box), str::buf(gname));
llvm::LLVMSetInitializer(g, box); llvm::LLVMSetInitializer(g, box);
llvm::LLVMSetGlobalConstant(g, True); llvm::LLVMSetGlobalConstant(g, True);
llvm::LLVMSetLinkage(g, lib::llvm::LLVMInternalLinkage as llvm::Linkage); llvm::LLVMSetLinkage(g, lib::llvm::LLVMInternalLinkage as llvm::Linkage);
@ -879,7 +888,9 @@ fn C_str(cx: &@crate_ctxt, s: &str) -> ValueRef {
// Returns a Plain Old LLVM String: // Returns a Plain Old LLVM String:
fn C_postr(s: &str) -> ValueRef { fn C_postr(s: &str) -> ValueRef {
ret llvm::LLVMConstString(str::buf(s), str::byte_len(s), False); ret istr::as_buf(istr::from_estr(s), { |buf|
llvm::LLVMConstString(buf, str::byte_len(s), False)
});
} }
fn C_zero_byte_arr(size: uint) -> ValueRef { fn C_zero_byte_arr(size: uint) -> ValueRef {
@ -911,9 +922,10 @@ fn C_bytes(bytes: &[u8]) -> ValueRef {
fn C_shape(ccx: &@crate_ctxt, bytes: &[u8]) -> ValueRef { fn C_shape(ccx: &@crate_ctxt, bytes: &[u8]) -> ValueRef {
let llshape = C_bytes(bytes); let llshape = C_bytes(bytes);
let gname = ccx.names.next("shape"); let llglobal = istr::as_buf(
let llglobal = istr::from_estr(ccx.names.next("shape")), { |buf|
llvm::LLVMAddGlobal(ccx.llmod, val_ty(llshape), str::buf(gname)); llvm::LLVMAddGlobal(ccx.llmod, val_ty(llshape), buf)
});
llvm::LLVMSetInitializer(llglobal, llshape); llvm::LLVMSetInitializer(llglobal, llshape);
llvm::LLVMSetGlobalConstant(llglobal, True); llvm::LLVMSetGlobalConstant(llglobal, True);
llvm::LLVMSetLinkage(llglobal, llvm::LLVMSetLinkage(llglobal,

View file

@ -571,9 +571,9 @@ fn finish_vtbl(cx: @local_ctxt, llmethods: [ValueRef], name: str) ->
let vtbl = C_struct(llmethods); let vtbl = C_struct(llmethods);
let vtbl_name = mangle_internal_name_by_path( let vtbl_name = mangle_internal_name_by_path(
cx.ccx, istr::from_estrs(cx.path + [name])); cx.ccx, istr::from_estrs(cx.path + [name]));
let vtbl_name = istr::to_estr(vtbl_name); let gvar = istr::as_buf(vtbl_name, { |buf|
let gvar = llvm::LLVMAddGlobal(cx.ccx.llmod, val_ty(vtbl), buf)
llvm::LLVMAddGlobal(cx.ccx.llmod, val_ty(vtbl), str::buf(vtbl_name)); });
llvm::LLVMSetInitializer(gvar, vtbl); llvm::LLVMSetInitializer(gvar, vtbl);
llvm::LLVMSetGlobalConstant(gvar, True); llvm::LLVMSetGlobalConstant(gvar, True);
llvm::LLVMSetLinkage(gvar, llvm::LLVMSetLinkage(gvar,