]> git.lizzy.rs Git - rust.git/commitdiff
Add link_section attribute for static and fn items
authorKevin Murphy <kemurphy.cmu@gmail.com>
Tue, 23 Jul 2013 02:34:04 +0000 (22:34 -0400)
committerKevin Murphy <kemurphy.cmu@gmail.com>
Tue, 23 Jul 2013 02:34:04 +0000 (22:34 -0400)
This allows for control over the section placement of static, static
mut, and fn items.  One caveat is that if a static and a static mut are
placed in the same section, the static is declared first, and the static
mut is assigned to, the generated program crashes.  For example:

#[link_section=".boot"]
static foo : uint = 0xdeadbeef;

#[link_section=".boot"]
static mut bar : uint = 0xcafebabe;

Declaring bar first would mark .bootdata as writable, preventing the
crash when bar is written to.

src/librustc/middle/trans/base.rs

index da92e76e1997f70d9b336a590e62b12b26e7d688..7e8806aa58b9b214a5cf9ac172d5eabd6c102c27 100644 (file)
@@ -2456,7 +2456,7 @@ pub fn get_item_val(ccx: @mut CrateContext, id: ast::node_id) -> ValueRef {
         let val = match item {
           ast_map::node_item(i, pth) => {
             let my_path = vec::append((*pth).clone(), [path_name(i.ident)]);
-            match i.node {
+            let v = match i.node {
               ast::item_static(_, m, expr) => {
                 let typ = ty::node_id_to_type(ccx.tcx, i.id);
                 let s = mangle_exported_name(ccx, my_path, typ);
@@ -2488,7 +2488,16 @@ pub fn get_item_val(ccx: @mut CrateContext, id: ast::node_id) -> ValueRef {
                 llfn
               }
               _ => fail!("get_item_val: weird result in table")
+            };
+            match (attr::first_attr_value_str_by_name(i.attrs, "link_section")) {
+                Some(sect) => unsafe {
+                    do sect.as_c_str |buf| {
+                        llvm::LLVMSetSection(v, buf);
+                    }
+                },
+                None => ()
             }
+            v
           }
           ast_map::node_trait_method(trait_method, _, pth) => {
             debug!("get_item_val(): processing a node_trait_method");