diff options
| author | Simonas Kazlauskas <git@kazlauskas.me> | 2015-02-27 13:34:33 +0200 |
|---|---|---|
| committer | Simonas Kazlauskas <git@kazlauskas.me> | 2015-04-03 15:46:03 +0300 |
| commit | 723ca4bd4dd68a351dbd001ed1ae958e13c4bc8c (patch) | |
| tree | f5539906e242c1ba50a7bd60ef3b8c6caeacf061 | |
| parent | b9a11f0f85416924487e17601458eb07b2e9fa06 (diff) | |
| download | rust-723ca4bd4dd68a351dbd001ed1ae958e13c4bc8c.tar.gz rust-723ca4bd4dd68a351dbd001ed1ae958e13c4bc8c.zip | |
Validate export_name attribute
| -rw-r--r-- | src/librustc_trans/trans/base.rs | 12 | ||||
| -rw-r--r-- | src/libsyntax/attr.rs | 17 |
2 files changed, 22 insertions, 7 deletions
diff --git a/src/librustc_trans/trans/base.rs b/src/librustc_trans/trans/base.rs index 05c366a645e..321cd33bbeb 100644 --- a/src/librustc_trans/trans/base.rs +++ b/src/librustc_trans/trans/base.rs @@ -1692,9 +1692,9 @@ pub fn build_return_block<'blk, 'tcx>(fcx: &FunctionContext<'blk, 'tcx>, } } -// trans_closure: Builds an LLVM function out of a source function. -// If the function closes over its environment a closure will be -// returned. +/// Builds an LLVM function out of a source function. +/// +/// If the function closes over its environment a closure will be returned. pub fn trans_closure<'a, 'b, 'tcx>(ccx: &CrateContext<'a, 'tcx>, decl: &ast::FnDecl, body: &ast::Block, @@ -1827,8 +1827,7 @@ pub fn trans_closure<'a, 'b, 'tcx>(ccx: &CrateContext<'a, 'tcx>, finish_fn(&fcx, bcx, output_type, ret_debug_loc); } -// trans_fn: creates an LLVM function corresponding to a source language -// function. +/// Creates an LLVM function corresponding to a source language function. pub fn trans_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, decl: &ast::FnDecl, body: &ast::Block, @@ -2645,10 +2644,9 @@ fn exported_name<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, id: ast::NodeId, None => {} } - match attr::first_attr_value_str_by_name(attrs, "export_name") { + match attr::find_export_name_attr(ccx.sess().diagnostic(), attrs) { // Use provided name Some(name) => name.to_string(), - _ => ccx.tcx().map.with_path(id, |path| { if attr::contains_name(attrs, "no_mangle") { // Don't mangle diff --git a/src/libsyntax/attr.rs b/src/libsyntax/attr.rs index 06e447bb12a..b966fe2c6e5 100644 --- a/src/libsyntax/attr.rs +++ b/src/libsyntax/attr.rs @@ -282,6 +282,23 @@ pub fn find_crate_name(attrs: &[Attribute]) -> Option<InternedString> { first_attr_value_str_by_name(attrs, "crate_name") } +/// Find the value of #[export_name=*] attribute and check its validity. +pub fn find_export_name_attr(diag: &SpanHandler, attrs: &[Attribute]) -> Option<InternedString> { + attrs.iter().fold(None, |ia,attr| { + if attr.check_name("export_name") { + if let s@Some(_) = attr.value_str() { + s + } else { + diag.span_err(attr.span, "export_name attribute has invalid format"); + diag.handler.help("use #[export_name=\"*\"]"); + None + } + } else { + ia + } + }) +} + #[derive(Copy, Clone, PartialEq)] pub enum InlineAttr { None, |
