Skip to content

Commit

Permalink
implement #[nolink]; deprecate #[link_name = ""]; note in stdlib to r…
Browse files Browse the repository at this point in the history
…emove empty link_name.

Can't remove them from stdlib until the snapshotted compiler supports #[nolink].
  • Loading branch information
gmfawcett authored and brson committed Dec 16, 2011
1 parent 8dc5c44 commit 7ddd353
Show file tree
Hide file tree
Showing 16 changed files with 34 additions and 19 deletions.
4 changes: 2 additions & 2 deletions doc/tutorial/ffi.md
Expand Up @@ -189,7 +189,7 @@ microsecond-resolution timer.
use std;
type timeval = {mutable tv_sec: u32,
mutable tv_usec: u32};
#[link_name = ""]
#[nolink]
native mod libc {
fn gettimeofday(tv: *timeval, tz: *()) -> i32;
}
Expand All @@ -199,7 +199,7 @@ microsecond-resolution timer.
ret (x.tv_sec as u64) * 1000_000_u64 + (x.tv_usec as u64);
}

The `#[link_name = ""]` sets the name of the native module to the
The `#[nolink]` sets the name of the native module to the
empty string to prevent the rust compiler from trying to link it.
The standard C library is already linked with Rust programs.

Expand Down
8 changes: 8 additions & 0 deletions src/comp/metadata/creader.rs
Expand Up @@ -57,12 +57,20 @@ fn visit_item(e: env, i: @ast::item) {
}
either::left(msg) { e.sess.span_fatal(i.span, msg); }
}

let cstore = e.sess.get_cstore();
let native_name = i.ident;
if vec::len(attr::find_attrs_by_name(i.attrs, "nolink")) > 0u {
ret;
}
alt attr::get_meta_item_value_str_by_name(i.attrs, "link_name") {
some(nn) { native_name = nn; }
none. { }
}
if native_name == "" {
e.sess.span_fatal(i.span,
"empty #[link_name] not allowed; use #[nolink].");
}
if !cstore::add_used_library(cstore, native_name) { ret; }
for a: ast::attribute in
attr::find_attrs_by_name(i.attrs, "link_args") {
Expand Down
1 change: 0 additions & 1 deletion src/comp/metadata/cstore.rs
Expand Up @@ -93,7 +93,6 @@ fn add_used_library(cstore: cstore, lib: str) -> bool {
if lib == "" { ret false; }

if vec::member(lib, p(cstore).used_libraries) { ret false; }

p(cstore).used_libraries += [lib];
ret true;
}
Expand Down
3 changes: 2 additions & 1 deletion src/libstd/linux_os.rs
Expand Up @@ -24,7 +24,8 @@ export fsync_fd;
// FIXME Somehow merge stuff duplicated here and macosx_os.rs. Made difficult
// by https://github.com/graydon/rust/issues#issue/268

#[link_name = ""]
#[link_name = ""] // FIXME remove after #[nolink] is snapshotted
#[nolink]
#[abi = "cdecl"]
native mod libc {
fn read(fd: fd_t, buf: *u8, count: size_t) -> ssize_t;
Expand Down
5 changes: 3 additions & 2 deletions src/libstd/macos_os.rs
Expand Up @@ -18,7 +18,7 @@ export fsync_fd;
// FIXME Refactor into unix_os module or some such. Doesn't
// seem to work right now.

#[link_name = ""]
#[nolink]
#[abi = "cdecl"]
native mod libc {
fn read(fd: fd_t, buf: *u8, count: size_t) -> ssize_t;
Expand Down Expand Up @@ -118,7 +118,8 @@ native mod rustrt {

fn getcwd() -> str { ret rustrt::rust_getcwd(); }

#[link_name = ""]
#[link_name = ""] // FIXME remove after #[nolink] is snapshotted
#[nolink]
#[abi = "cdecl"]
native mod mac_libc {
fn _NSGetExecutablePath(buf: str::sbuf,
Expand Down
3 changes: 2 additions & 1 deletion src/libstd/win32_os.rs
Expand Up @@ -2,7 +2,8 @@ import core::option;
import ctypes::*;

#[abi = "cdecl"]
#[link_name = ""]
#[link_name = ""] // FIXME remove after #[nolink] is snapshotted
#[nolink]
native mod libc {
fn read(fd: fd_t, buf: *u8, count: size_t) -> ssize_t;
fn write(fd: fd_t, buf: *u8, count: size_t) -> ssize_t;
Expand Down
2 changes: 1 addition & 1 deletion src/test/bench/shootout-nbody.rs
Expand Up @@ -2,7 +2,7 @@
// http://shootout.alioth.debian.org/u32/benchmark.php?test=nbody&lang=java

#[abi = "cdecl"]
#[link_name = ""]
#[nolink]
native mod llvm {
fn sqrt(n: float) -> float;
}
Expand Down
5 changes: 5 additions & 0 deletions src/test/compile-fail/empty-linkname.rs
@@ -0,0 +1,5 @@
// error-pattern:empty #[link_name] not allowed; use #[nolink].

#[link_name = ""]
native mod foo {
}
2 changes: 1 addition & 1 deletion src/test/run-pass/bind-native-fn.rs
Expand Up @@ -5,7 +5,7 @@ use std;
import str;
import ctypes::*;

#[link_name = ""]
#[nolink]
native mod libc {
fn write(fd: c_int, buf: *u8, nbyte: size_t);
}
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/binops.rs
Expand Up @@ -118,7 +118,7 @@ fn test_fn() {
}

#[abi = "cdecl"]
#[link_name = ""]
#[nolink]
native mod test {
fn do_gc();
fn unsupervise();
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/c-stack-returning-int64.rs
Expand Up @@ -2,7 +2,7 @@ use std;
import str;

#[abi = "cdecl"]
#[link_name = ""]
#[nolink]
native mod libc {
fn atol(x: str::sbuf) -> int;
fn atoll(x: str::sbuf) -> i64;
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/import-glob-1.rs
Expand Up @@ -21,7 +21,7 @@ mod a1 {
mod a2 {
// | | |
#[abi = "cdecl"]
#[link_name = ""]
#[nolink]
native mod b1 {
// | | |
import a1::b2::*;
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/native-fn-linkname.rs
Expand Up @@ -3,7 +3,7 @@ use std;
import vec;
import str;

#[link_name = ""]
#[nolink]
#[abi = "cdecl"]
native mod libc {
#[link_name = "strlen"]
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-pass/native-opaque-type.rs
@@ -1,7 +1,7 @@


#[abi = "cdecl"]
#[link_name = ""]
#[nolink]
native mod libc {
type file_handle;
}
Expand Down
8 changes: 4 additions & 4 deletions src/test/run-pass/native2.rs
Expand Up @@ -6,21 +6,21 @@ native mod rustrt {
}

#[abi = "cdecl"]
#[link_name = ""]
#[nolink]
native mod bar { }

#[abi = "cdecl"]
#[link_name = ""]
#[nolink]
native mod zed { }

#[abi = "cdecl"]
#[link_name = ""]
#[nolink]
native mod libc {
fn write(fd: int, buf: *u8, count: uint) -> int;
}

#[abi = "cdecl"]
#[link_name = ""]
#[nolink]
native mod baz { }

fn main(args: [str]) { }
2 changes: 1 addition & 1 deletion src/test/stdtest/c_vec.rs
Expand Up @@ -5,7 +5,7 @@ use std;
import std::c_vec::*;
import ctypes::*;

#[link_name = ""]
#[nolink]
#[abi = "cdecl"]
native mod libc {
fn malloc(n: size_t) -> *mutable u8;
Expand Down

0 comments on commit 7ddd353

Please sign in to comment.