Report a bug
If you spot a problem with this page, click here to create a Bugzilla issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page.
Requires a signed-in GitHub account. This works well for small changes.
If you'd like to make larger changes you may want to consider using
a local clone.
dmd.importc
Contains semantic routines specific to ImportC
Specification C11
Authors:
License:
Source importc.d
Documentation https://dlang.org/phobos/dmd_importc.html
- Type
cAdjustParamType(Typet, Scope*sc); - C11 does not allow array or function parameters. Hence, adjust those types per C11 6.7.6.3 rules.Parameters:
Type tparameter type to adjust Scope* sccontext Returns:adjusted type - Expression
arrayFuncConv(Expressione, Scope*sc); - C11 6.3.2.1-3 Convert expression that is an array of type to a pointer to type. C11 6.3.2.1-4 Convert expression that is a function to a pointer to a function.Parameters:
Expression eImportC expression to possibly convert Scope* sccontext Returns:converted expression - Expression
fieldLookup(Expressione, Scope*sc, Identifierid, boolarrow); - Run semantic on
e. Expressioneevaluates to an instance of a struct. Look up ident as a field of that struct.Parameters:Expression eevaluates to an instance of a struct Scope* sccontext Identifier ididentifier of a field in that struct bool arrow-> was used Returns:if successfule.ident if not then ErrorExp and message is printed - Expression
carraySemantic(ArrayExpae, Scope*sc); - C11 6.5.2.1-2 Apply C semantics to E[I] expression. E1[E2] is lowered to *(E1 + E2)Parameters:
ArrayExp aeArrayExp to run semantics on Scope* sccontext Returns:Expression if this was a C expression with completed semantic, null if not - void
addDefaultCInitializer(VarDeclarationdsym); - Determine default initializer for const global symbol.
- Expression
castCallAmbiguity(Expressione, Scope*sc); - Resolve cast/call grammar ambiguity.Parameters:
Expression eexpression that might be a cast, might be a call Scope* sccontext Returns:null means leave as is, !=null means rewritten AST - bool
cFuncEquivalence(TypeFunctiontf1, TypeFunctiontf2); - Implement the C11 notion of function equivalence, which allows prototyped functions to match K+R functions, even though they are different.Parameters:
TypeFunction tf1type of first function TypeFunction tf2type of second function Returns:true if C11 considers them equivalent - bool
cTypeEquivalence(Typet1, Typet2); - Types haven't been merged yet, because we haven't done semantic() yet. But we still need to see if t1 and t2 are the same type.Parameters:
Type t1first type Type t2second type Returns:true if they are equivalent types - Dsymbol
handleTagSymbols(ref Scopesc, Dsymbols, Dsymbols2, ScopeDsymbolsds); - ImportC tag symbols sit in a parallel symbol table, so that this C code works:
struct S { a; }; int S; struct S s;
But there are relatively few such tag symbols, so that would be a waste of memory and complexity. An additional problem is we'd like the D side to find the tag symbols with ordinary lookup, not lookup in both tables, if the tag symbol is not conflicting with an ordinary symbol. The solution is to put the tag symbols that conflict into an associative array, indexed by the address of the ordinary symbol that conflicts with it. C has no modules, so this associative array is tagSymTab[] in ModuleDeclaration. A side effect of our approach is that D code cannot access a tag symbol that is hidden by an ordinary symbol. This is more of a theoretical problem, as nobody has mentioned it when importing C headers. If someone wants to do it, too bad so sad. Change the C code. This function fixes up the symbol table when faced with adding a new symbolswhen there is an existing symbols2with the same name. C also allows forward and prototype declarations of tag symbols, this function merges those.Parameters:Scope sccontext Dsymbol ssymbol to add to symbol table Dsymbol s2existing declaration ScopeDsymbol sdssymbol table Returns:if s and s2 are successfully put in symbol table then return the merged symbol, null if they conflict - Dsymbol
handleSymbolRedeclarations(ref Scopesc, Dsymbols, Dsymbols2, ScopeDsymbolsds); - ImportC allows redeclarations of C variables, functions and typedefs. extern int x; int x = 3; and: extern void f(); void f() { } Attempt to merge them.Parameters:
Scope sccontext Dsymbol ssymbol to add to symbol table Dsymbol s2existing declaration ScopeDsymbol sdssymbol table Returns:if s and s2 are successfully put in symbol table then return the merged symbol, null if they conflict
Copyright © 1999-2025 by the D Language Foundation | Page generated by
Ddoc on Mon Mar 31 10:27:56 2025