rustc: Introduce ABI versioning so we can change value representations without breaking the compiler

This commit is contained in:
Patrick Walton 2011-08-20 14:22:09 -07:00
parent 2f650038ad
commit 25416bfae1
6 changed files with 35 additions and 6 deletions

View File

@ -26,6 +26,7 @@ RUNTIME_CS := rt/sync/timer.cpp \
rt/rust_shape.cpp \ rt/rust_shape.cpp \
rt/rust_obstack.cpp \ rt/rust_obstack.cpp \
rt/rust_gc.cpp \ rt/rust_gc.cpp \
rt/rust_abi.cpp \
rt/memory_region.cpp \ rt/memory_region.cpp \
rt/test/rust_test_harness.cpp \ rt/test/rust_test_harness.cpp \
rt/test/rust_test_runtime.cpp \ rt/test/rust_test_runtime.cpp \

View File

@ -112,6 +112,8 @@ const ivec_heap_elt_elems: uint = 1u;
const worst_case_glue_call_args: int = 7; const worst_case_glue_call_args: int = 7;
const abi_version: uint = 1u;
fn memcpy_glue_name() -> str { ret "rust_memcpy_glue"; } fn memcpy_glue_name() -> str { ret "rust_memcpy_glue"; }
fn bzero_glue_name() -> str { ret "rust_bzero_glue"; } fn bzero_glue_name() -> str { ret "rust_bzero_glue"; }

View File

@ -84,15 +84,20 @@ fn eq_res_info(a: &res_info, b: &res_info) -> bool {
ret a.did.crate == b.did.crate && a.did.node == b.did.node && a.t == b.t; ret a.did.crate == b.did.crate && a.did.node == b.did.node && a.t == b.t;
} }
fn mk_global(ccx: &@crate_ctxt, name: &str, llval: ValueRef) -> ValueRef { fn mk_global(ccx: &@crate_ctxt, name: &str, llval: ValueRef,
internal: bool) -> ValueRef {
let llglobal = let llglobal =
lib::llvm::llvm::LLVMAddGlobal(ccx.llmod, val_ty(llval), lib::llvm::llvm::LLVMAddGlobal(ccx.llmod, val_ty(llval),
str::buf(name)); 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);
lib::llvm::llvm::LLVMSetLinkage(llglobal,
lib::llvm::LLVMInternalLinkage as if (internal) {
lib::llvm::llvm::Linkage); lib::llvm::llvm::LLVMSetLinkage(llglobal,
lib::llvm::LLVMInternalLinkage as
lib::llvm::llvm::Linkage);
}
ret llglobal; ret llglobal;
} }
@ -510,7 +515,7 @@ fn gen_tag_shapes(ccx: &@crate_ctxt) -> ValueRef {
header += data; header += data;
header += lv_table; header += lv_table;
ret mk_global(ccx, "tag_shapes", C_bytes(header)); ret mk_global(ccx, "tag_shapes", C_bytes(header), true);
} }
fn gen_resource_shapes(ccx: &@crate_ctxt) -> ValueRef { fn gen_resource_shapes(ccx: &@crate_ctxt) -> ValueRef {
@ -523,7 +528,7 @@ fn gen_resource_shapes(ccx: &@crate_ctxt) -> ValueRef {
i += 1u; i += 1u;
} }
ret mk_global(ccx, "resource_shapes", C_struct(dtors)); ret mk_global(ccx, "resource_shapes", C_struct(dtors), true);
} }
fn gen_shape_tables(ccx: &@crate_ctxt) { fn gen_shape_tables(ccx: &@crate_ctxt) {

View File

@ -6926,6 +6926,12 @@ fn write_metadata(cx: &@crate_ctxt, crate: &@ast::crate) {
llvm::LLVMSetInitializer(llvm_used, C_array(t_ptr_i8, [llglobal])); llvm::LLVMSetInitializer(llvm_used, C_array(t_ptr_i8, [llglobal]));
} }
// Writes the current ABI version into the crate.
fn write_abi_version(ccx: &@crate_ctxt) {
shape::mk_global(ccx, "rust_abi_version", C_uint(abi::abi_version),
false);
}
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) -> ModuleRef { output: &str, amap: &ast_map::map) -> ModuleRef {
let llmod = let llmod =
@ -7001,6 +7007,7 @@ fn trans_crate(sess: &session::session, crate: &@ast::crate, tcx: &ty::ctxt,
create_crate_map(ccx); create_crate_map(ccx);
emit_tydescs(ccx); emit_tydescs(ccx);
shape::gen_shape_tables(ccx); shape::gen_shape_tables(ccx);
write_abi_version(ccx);
// Translate the metadata. // Translate the metadata.
write_metadata(cx.ccx, crate); write_metadata(cx.ccx, crate);

10
src/rt/rust_abi.cpp Normal file
View File

@ -0,0 +1,10 @@
#include <cstdlib>
#include <stdint.h>
#include "rust_abi.h"
weak_symbol<uint32_t> abi_version("rust_abi_version");
uint32_t get_abi_version() {
return (*abi_version == NULL) ? 0 : **abi_version;
}

View File

@ -1,6 +1,8 @@
#ifndef RUST_ABI_H #ifndef RUST_ABI_H
#define RUST_ABI_H #define RUST_ABI_H
#include <cstdlib>
#ifdef __WIN32__ #ifdef __WIN32__
#include <windows.h> #include <windows.h>
#else #else
@ -34,5 +36,7 @@ public:
T *&operator*() { fill(); return data; } T *&operator*() { fill(); return data; }
}; };
uint32_t get_abi_version();
#endif #endif