Use attributes for native module ABI and link name
This patch changes how to specify ABI and link name of a native module.
Before:
native "cdecl" mod llvm = "rustllvm" {...}
After:
#[abi = "cdecl"]
#[link_name = "rustllvm"]
native mod llvm {...}
The old optional syntax for ABI and link name is no longer supported.
Fixes issue #547
This commit is contained in:
parent
7a9b66db63
commit
88f29aab27
46 changed files with 168 additions and 128 deletions
|
|
@ -45,8 +45,7 @@ fn fold_native_mod(cfg: ast::crate_cfg, nm: ast::native_mod,
|
|||
fld: fold::ast_fold) -> ast::native_mod {
|
||||
let filter = bind filter_native_item(cfg, _);
|
||||
let filtered_items = vec::filter_map(filter, nm.items);
|
||||
ret {native_name: nm.native_name,
|
||||
abi: nm.abi,
|
||||
ret {abi: nm.abi,
|
||||
view_items: vec::map(fld.fold_view_item, nm.view_items),
|
||||
items: filtered_items};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -110,7 +110,9 @@ const LLVMRealULE: uint = 13u;
|
|||
const LLVMRealUNE: uint = 14u;
|
||||
|
||||
#[link_args = "-Lrustllvm"]
|
||||
native "cdecl" mod llvm = "rustllvm" {
|
||||
#[link_name = "rustllvm"]
|
||||
#[abi = "cdecl"]
|
||||
native mod llvm {
|
||||
|
||||
type ModuleRef;
|
||||
type ContextRef;
|
||||
|
|
|
|||
|
|
@ -54,7 +54,12 @@ fn visit_item(e: env, i: @ast::item) {
|
|||
ret;
|
||||
}
|
||||
let cstore = e.sess.get_cstore();
|
||||
if !cstore::add_used_library(cstore, m.native_name) { ret; }
|
||||
let native_name = i.ident;
|
||||
alt attr::get_meta_item_value_str_by_name(i.attrs, "link_name") {
|
||||
some(nn) { native_name = nn; }
|
||||
none. { }
|
||||
}
|
||||
if !cstore::add_used_library(cstore, native_name) { ret; }
|
||||
for a: ast::attribute in
|
||||
attr::find_attrs_by_name(i.attrs, "link_args") {
|
||||
|
||||
|
|
|
|||
|
|
@ -432,7 +432,7 @@ tag native_abi {
|
|||
}
|
||||
|
||||
type native_mod =
|
||||
{native_name: str,
|
||||
{// FIXME: Removing abi from AST. Depends on Issue #1179.
|
||||
abi: native_abi,
|
||||
view_items: [@view_item],
|
||||
items: [@native_item]};
|
||||
|
|
|
|||
|
|
@ -452,8 +452,7 @@ fn noop_fold_mod(m: _mod, fld: ast_fold) -> _mod {
|
|||
}
|
||||
|
||||
fn noop_fold_native_mod(nm: native_mod, fld: ast_fold) -> native_mod {
|
||||
ret {native_name: nm.native_name,
|
||||
abi: nm.abi,
|
||||
ret {abi: nm.abi,
|
||||
view_items: vec::map(fld.fold_view_item, nm.view_items),
|
||||
items: vec::map(fld.fold_native_item, nm.items)}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1978,7 +1978,7 @@ fn parse_native_item(p: parser, attrs: [ast::attribute]) ->
|
|||
} else { unexpected(p, p.peek()); }
|
||||
}
|
||||
|
||||
fn parse_native_mod_items(p: parser, native_name: str, abi: ast::native_abi,
|
||||
fn parse_native_mod_items(p: parser, abi: ast::native_abi,
|
||||
first_item_attrs: [ast::attribute]) ->
|
||||
ast::native_mod {
|
||||
// Shouldn't be any view items since we've already parsed an item attr
|
||||
|
|
@ -1993,63 +1993,37 @@ fn parse_native_mod_items(p: parser, native_name: str, abi: ast::native_abi,
|
|||
initial_attrs = [];
|
||||
items += [parse_native_item(p, attrs)];
|
||||
}
|
||||
ret {native_name: native_name,
|
||||
abi: abi,
|
||||
ret {abi: abi,
|
||||
view_items: view_items,
|
||||
items: items};
|
||||
}
|
||||
|
||||
fn parse_item_native_mod(p: parser, attrs: [ast::attribute]) -> @ast::item {
|
||||
let lo = p.get_last_lo_pos();
|
||||
let abi = ast::native_abi_cdecl;
|
||||
if !is_word(p, "mod") {
|
||||
let t = parse_str(p);
|
||||
if str::eq(t, "rust-intrinsic") {
|
||||
abi = ast::native_abi_rust_intrinsic;
|
||||
} else if str::eq(t, "cdecl") {
|
||||
abi = ast::native_abi_cdecl;
|
||||
} else if str::eq(t, "stdcall") {
|
||||
abi = ast::native_abi_stdcall;
|
||||
} else {
|
||||
p.fatal("unsupported abi: " + t);
|
||||
}
|
||||
} else {
|
||||
abi =
|
||||
alt attr::get_meta_item_value_str_by_name(attrs, "abi") {
|
||||
none. { ast::native_abi_cdecl }
|
||||
some("rust-intrinsic") {
|
||||
ast::native_abi_rust_intrinsic
|
||||
}
|
||||
some("cdecl") {
|
||||
ast::native_abi_cdecl
|
||||
}
|
||||
some("stdcall") {
|
||||
ast::native_abi_stdcall
|
||||
}
|
||||
some(t) {
|
||||
p.fatal("unsupported abi: " + t);
|
||||
}
|
||||
};
|
||||
}
|
||||
expect_word(p, "mod");
|
||||
let id = parse_ident(p);
|
||||
let native_name;
|
||||
if p.peek() == token::EQ {
|
||||
expect(p, token::EQ);
|
||||
native_name = parse_str(p);
|
||||
} else {
|
||||
native_name =
|
||||
alt attr::get_meta_item_value_str_by_name(attrs, "link_name") {
|
||||
none. { id }
|
||||
some(nn) { nn }
|
||||
};
|
||||
}
|
||||
expect(p, token::LBRACE);
|
||||
let more_attrs = parse_inner_attrs_and_next(p);
|
||||
let inner_attrs = more_attrs.inner;
|
||||
let first_item_outer_attrs = more_attrs.next;
|
||||
let m =
|
||||
parse_native_mod_items(p, native_name, abi, first_item_outer_attrs);
|
||||
let abi =
|
||||
alt attr::get_meta_item_value_str_by_name(
|
||||
attrs + inner_attrs, "abi") {
|
||||
none. { ast::native_abi_cdecl }
|
||||
some("rust-intrinsic") {
|
||||
ast::native_abi_rust_intrinsic
|
||||
}
|
||||
some("cdecl") {
|
||||
ast::native_abi_cdecl
|
||||
}
|
||||
some("stdcall") {
|
||||
ast::native_abi_stdcall
|
||||
}
|
||||
some(t) {
|
||||
p.fatal("unsupported abi: " + t);
|
||||
}
|
||||
};
|
||||
let m = parse_native_mod_items(p, abi, first_item_outer_attrs);
|
||||
let hi = p.get_hi_pos();
|
||||
expect(p, token::RBRACE);
|
||||
ret mk_item(p, lo, hi, id, ast::item_native_mod(m), attrs + inner_attrs);
|
||||
|
|
|
|||
|
|
@ -395,24 +395,8 @@ fn print_item(s: ps, &&item: @ast::item) {
|
|||
}
|
||||
ast::item_native_mod(nmod) {
|
||||
head(s, "native");
|
||||
alt nmod.abi {
|
||||
ast::native_abi_rust_intrinsic. {
|
||||
word_nbsp(s, "\"rust-intrinsic\"");
|
||||
}
|
||||
ast::native_abi_cdecl. {
|
||||
word_nbsp(s, "\"cdecl\"");
|
||||
}
|
||||
ast::native_abi_stdcall. {
|
||||
word_nbsp(s, "\"stdcall\"");
|
||||
}
|
||||
}
|
||||
word_nbsp(s, "mod");
|
||||
word_nbsp(s, item.ident);
|
||||
if !str::eq(nmod.native_name, item.ident) {
|
||||
word_space(s, "=");
|
||||
print_string(s, nmod.native_name);
|
||||
nbsp(s);
|
||||
}
|
||||
bopen(s);
|
||||
print_native_mod(s, nmod, item.attrs);
|
||||
bclose(s, item.span);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue