2012-12-03 18:48:01 -06:00
|
|
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
|
|
// file at the top-level directory of this distribution and at
|
|
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
2011-08-04 12:46:10 -05:00
|
|
|
// A "shape" is a compact encoding of a type that is used by interpreted glue.
|
|
|
|
// This substitutes for the runtime tags used by e.g. MLs.
|
|
|
|
|
2013-01-07 16:16:52 -06:00
|
|
|
|
2012-09-04 13:54:36 -05:00
|
|
|
use lib::llvm::llvm;
|
2013-03-26 15:38:07 -05:00
|
|
|
use lib::llvm::{True, ModuleRef, ValueRef};
|
2012-09-04 13:54:36 -05:00
|
|
|
use middle::trans::common::*;
|
2012-12-23 16:41:37 -06:00
|
|
|
use middle::trans;
|
2011-08-04 12:46:10 -05:00
|
|
|
|
2013-02-25 13:11:21 -06:00
|
|
|
use core::str;
|
2011-08-04 12:46:10 -05:00
|
|
|
|
2013-02-04 16:02:01 -06:00
|
|
|
pub struct Ctxt {
|
|
|
|
next_tag_id: u16,
|
|
|
|
pad: u16,
|
|
|
|
pad2: u32
|
|
|
|
}
|
2011-08-04 12:46:10 -05:00
|
|
|
|
2013-06-13 02:19:50 -05:00
|
|
|
pub fn mk_global(ccx: &CrateContext,
|
|
|
|
name: &str,
|
2013-01-30 13:46:19 -06:00
|
|
|
llval: ValueRef,
|
|
|
|
internal: bool)
|
|
|
|
-> ValueRef {
|
2013-01-10 23:23:07 -06:00
|
|
|
unsafe {
|
|
|
|
let llglobal = do str::as_c_str(name) |buf| {
|
|
|
|
llvm::LLVMAddGlobal(ccx.llmod, val_ty(llval), buf)
|
|
|
|
};
|
|
|
|
llvm::LLVMSetInitializer(llglobal, llval);
|
|
|
|
llvm::LLVMSetGlobalConstant(llglobal, True);
|
2011-08-20 16:22:09 -05:00
|
|
|
|
2013-01-10 23:23:07 -06:00
|
|
|
if internal {
|
|
|
|
::lib::llvm::SetLinkage(llglobal,
|
|
|
|
::lib::llvm::InternalLinkage);
|
|
|
|
}
|
2011-08-20 16:22:09 -05:00
|
|
|
|
2013-01-10 23:23:07 -06:00
|
|
|
return llglobal;
|
|
|
|
}
|
2011-08-04 12:46:10 -05:00
|
|
|
}
|
|
|
|
|
2013-02-04 16:02:01 -06:00
|
|
|
pub fn mk_ctxt(llmod: ModuleRef) -> Ctxt {
|
2013-01-10 23:23:07 -06:00
|
|
|
unsafe {
|
2013-05-19 00:07:44 -05:00
|
|
|
let llshapetablesty = trans::common::T_named_struct("shapes");
|
|
|
|
let _llshapetables = str::as_c_str("shapes", |buf| {
|
2013-01-10 23:23:07 -06:00
|
|
|
llvm::LLVMAddGlobal(llmod, llshapetablesty, buf)
|
|
|
|
});
|
2011-08-04 12:46:10 -05:00
|
|
|
|
2013-02-04 16:02:01 -06:00
|
|
|
return Ctxt {
|
|
|
|
next_tag_id: 0u16,
|
|
|
|
pad: 0u16,
|
|
|
|
pad2: 0u32
|
|
|
|
};
|
2013-01-10 23:23:07 -06:00
|
|
|
}
|
2012-06-25 22:00:46 -05:00
|
|
|
}
|
2011-08-04 12:46:10 -05:00
|
|
|
|
2012-10-05 21:23:44 -05:00
|
|
|
/*
|
|
|
|
Although these two functions are never called, they are here
|
|
|
|
for a VERY GOOD REASON. See #3670
|
|
|
|
*/
|
2013-01-30 13:46:19 -06:00
|
|
|
pub fn add_u16(dest: &mut ~[u8], val: u16) {
|
2013-05-27 18:04:00 -05:00
|
|
|
*dest += [(val & 0xffu16) as u8, (val >> 8u16) as u8];
|
2011-08-04 12:46:10 -05:00
|
|
|
}
|
|
|
|
|
2013-01-30 13:46:19 -06:00
|
|
|
pub fn add_substr(dest: &mut ~[u8], src: ~[u8]) {
|
2013-05-14 04:52:12 -05:00
|
|
|
add_u16(&mut *dest, src.len() as u16);
|
2012-10-05 21:23:44 -05:00
|
|
|
*dest += src;
|
2011-08-04 12:46:10 -05:00
|
|
|
}
|