diff options
-rw-r--r-- | src/codegen/mod.rs | 9 | ||||
-rw-r--r-- | src/ir/comp.rs | 20 | ||||
-rw-r--r-- | src/ir/context.rs | 2 | ||||
-rw-r--r-- | src/ir/enum_ty.rs | 12 | ||||
-rw-r--r-- | src/ir/function.rs | 44 | ||||
-rw-r--r-- | src/ir/layout.rs | 4 | ||||
-rw-r--r-- | src/ir/template.rs | 9 | ||||
-rw-r--r-- | src/ir/traversal.rs | 4 | ||||
-rw-r--r-- | src/ir/ty.rs | 8 | ||||
-rw-r--r-- | src/ir/var.rs | 12 | ||||
-rw-r--r-- | src/lib.rs | 20 |
11 files changed, 94 insertions, 50 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index 607ceafe..4dbd2fc6 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -20,7 +20,7 @@ use ir::derive::{CanDeriveCopy, CanDeriveDebug, CanDeriveDefault, CanDerivePartialEq, CanDeriveEq, CannotDeriveReason}; use ir::dot; use ir::enum_ty::{Enum, EnumVariant, EnumVariantValue}; -use ir::function::{Abi, Function, FunctionSig}; +use ir::function::{Abi, Function, FunctionSig, Linkage}; use ir::int::IntKind; use ir::item::{IsOpaque, Item, ItemCanonicalName, ItemCanonicalPath}; use ir::item_kind::ItemKind; @@ -3130,6 +3130,13 @@ impl CodeGenerator for Function { debug!("<Function as CodeGenerator>::codegen: item = {:?}", item); debug_assert!(item.is_enabled_for_codegen(ctx)); + // We can't currently do anything with Internal functions so just + // avoid generating anything for them. + match self.linkage() { + Linkage::Internal => return, + Linkage::External => {} + } + // Similar to static member variables in a class template, we can't // generate bindings to template functions, because the set of // instantiations is open ended and we have no way of knowing which diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 374dca8d..3c041e7c 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -62,9 +62,9 @@ impl Method { /// Construct a new `Method`. pub fn new(kind: MethodKind, signature: FunctionId, is_const: bool) -> Self { Method { - kind: kind, - signature: signature, - is_const: is_const, + kind, + signature, + is_const, } } @@ -311,7 +311,7 @@ impl Bitfield { assert!(raw.bitfield_width().is_some()); Bitfield { - offset_into_unit: offset_into_unit, + offset_into_unit, data: raw.0, getter_name: None, setter_name: None, @@ -420,13 +420,13 @@ impl RawField { offset: Option<usize>, ) -> RawField { RawField(FieldData { - name: name, - ty: ty, - comment: comment, + name, + ty, + comment, annotations: annotations.unwrap_or_default(), - bitfield_width: bitfield_width, - mutable: mutable, - offset: offset, + bitfield_width, + mutable, + offset, }) } } diff --git a/src/ir/context.rs b/src/ir/context.rs index da692866..1979e34d 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -491,7 +491,7 @@ impl<'ctx> WhitelistedItemsTraversal<'ctx> { R: IntoIterator<Item = ItemId>, { WhitelistedItemsTraversal { - ctx: ctx, + ctx, traversal: ItemTraversal::new(ctx, roots, predicate), } } diff --git a/src/ir/enum_ty.rs b/src/ir/enum_ty.rs index 3006ec7f..d0968515 100644 --- a/src/ir/enum_ty.rs +++ b/src/ir/enum_ty.rs @@ -37,8 +37,8 @@ impl Enum { /// Construct a new `Enum` with the given representation and variants. pub fn new(repr: Option<TypeId>, variants: Vec<EnumVariant>) -> Self { Enum { - repr: repr, - variants: variants, + repr, + variants, } } @@ -204,10 +204,10 @@ impl EnumVariant { custom_behavior: Option<EnumVariantCustomBehavior>, ) -> Self { EnumVariant { - name: name, - comment: comment, - val: val, - custom_behavior: custom_behavior, + name, + comment, + val, + custom_behavior, } } diff --git a/src/ir/function.rs b/src/ir/function.rs index 2eab6638..60a7effd 100644 --- a/src/ir/function.rs +++ b/src/ir/function.rs @@ -49,6 +49,15 @@ impl FunctionKind { } } +/// The style of linkage +#[derive(Debug, Clone, Copy)] +pub enum Linkage { + /// Externally visible and can be linked against + External, + /// Not exposed externally. 'static inline' functions will have this kind of linkage + Internal +} + /// A function declaration, with a signature, arguments, and argument names. /// /// The argument names vector must be the same length as the ones in the @@ -69,6 +78,9 @@ pub struct Function { /// The kind of function this is. kind: FunctionKind, + + /// The linkage of the function. + linkage: Linkage, } impl Function { @@ -76,16 +88,18 @@ impl Function { pub fn new( name: String, mangled_name: Option<String>, - sig: TypeId, + signature: TypeId, comment: Option<String>, kind: FunctionKind, + linkage: Linkage ) -> Self { Function { - name: name, - mangled_name: mangled_name, - signature: sig, - comment: comment, - kind: kind, + name, + mangled_name, + signature, + comment, + kind, + linkage, } } @@ -108,6 +122,12 @@ impl Function { pub fn kind(&self) -> FunctionKind { self.kind } + + /// Get this function's linkage. + pub fn linkage(&self) -> Linkage { + self.linkage + } + } impl DotAttributes for Function { @@ -477,11 +497,11 @@ impl ClangSubItemParser for Function { } let linkage = cursor.linkage(); - if linkage != CXLinkage_External && - linkage != CXLinkage_UniqueExternal - { - return Err(ParseError::Continue); - } + let linkage = match linkage { + CXLinkage_External | CXLinkage_UniqueExternal => Linkage::External, + CXLinkage_Internal => Linkage::Internal, + _ => return Err(ParseError::Continue) + }; // Grab the signature using Item::from_ty. let sig = @@ -511,7 +531,7 @@ impl ClangSubItemParser for Function { let comment = cursor.raw_comment(); - let function = Self::new(name, mangled_name, sig, comment, kind); + let function = Self::new(name, mangled_name, sig, comment, kind, linkage); Ok(ParseResult::New(function, Some(cursor))) } } diff --git a/src/ir/layout.rs b/src/ir/layout.rs index 0d9c123f..ac875ca4 100644 --- a/src/ir/layout.rs +++ b/src/ir/layout.rs @@ -33,8 +33,8 @@ impl Layout { /// packed. pub fn new(size: usize, align: usize) -> Self { Layout { - size: size, - align: align, + size, + align, packed: false, } } diff --git a/src/ir/template.rs b/src/ir/template.rs index f5cc0152..11a799f4 100644 --- a/src/ir/template.rs +++ b/src/ir/template.rs @@ -214,16 +214,13 @@ pub struct TemplateInstantiation { impl TemplateInstantiation { /// Construct a new template instantiation from the given parts. - pub fn new<I>( - template_definition: TypeId, - template_args: I, - ) -> TemplateInstantiation + pub fn new<I>(definition: TypeId, args: I) -> TemplateInstantiation where I: IntoIterator<Item = TypeId>, { TemplateInstantiation { - definition: template_definition, - args: template_args.into_iter().collect(), + definition, + args: args.into_iter().collect(), } } diff --git a/src/ir/traversal.rs b/src/ir/traversal.rs index f55acc10..b9b3179a 100644 --- a/src/ir/traversal.rs +++ b/src/ir/traversal.rs @@ -21,8 +21,8 @@ impl Edge { /// Construct a new edge whose referent is `to` and is of the given `kind`. pub fn new(to: ItemId, kind: EdgeKind) -> Edge { Edge { - to: to, - kind: kind, + to, + kind, } } } diff --git a/src/ir/ty.rs b/src/ir/ty.rs index 0db91385..12ecbc66 100644 --- a/src/ir/ty.rs +++ b/src/ir/ty.rs @@ -69,10 +69,10 @@ impl Type { is_const: bool, ) -> Self { Type { - name: name, - layout: layout, - kind: kind, - is_const: is_const, + name, + layout, + kind, + is_const, } } diff --git a/src/ir/var.rs b/src/ir/var.rs index 3abc44cf..9d6c1452 100644 --- a/src/ir/var.rs +++ b/src/ir/var.rs @@ -46,18 +46,18 @@ impl Var { /// Construct a new `Var`. pub fn new( name: String, - mangled: Option<String>, + mangled_name: Option<String>, ty: TypeId, val: Option<VarType>, is_const: bool, ) -> Var { assert!(!name.is_empty()); Var { - name: name, - mangled_name: mangled, - ty: ty, - val: val, - is_const: is_const, + name, + mangled_name, + ty, + val, + is_const, } } @@ -1542,7 +1542,27 @@ impl Bindings { } } + #[cfg(unix)] + fn can_read(perms: &std::fs::Permissions) -> bool { + use std::os::unix::fs::PermissionsExt; + perms.mode() & 0o444 > 0 + } + + #[cfg(not(unix))] + fn can_read(_: &std::fs::Permissions) -> bool { + true + } + if let Some(h) = options.input_header.as_ref() { + let md = std::fs::metadata(h).ok().unwrap(); + if !md.is_file() { + eprintln!("error: '{}' is a folder", h); + return Err(()); + } + if !can_read(&md.permissions()) { + eprintln!("error: insufficient permissions to read '{}'", h); + return Err(()); + } options.clang_args.push(h.clone()) } |