On Friday, 30 March 2018 at 10:23:15 UTC, Cecil Ward wrote:
Say that I use say GDC or LDC. I want to declare a routine as
public in one compilation unit (.d src file) and be able to
access it from other compilation units.
Do I simply declare the routine with the word keyword public
before the usual declaration?
Or maybe that is the default, like not using the keyword static
with function declarations in C?
Global functions in a module have default "public" visibility
indeed.
https://dlang.org/spec/attribute.html#visibility_attributes
My principal question: If I successfully do this, with GCC or
LDC, will I be able to get the code for the externally defined
short routine expanded inline and fully integrated into the
generated code that corresponds to the calling source code? (So
no ‘call’ instruction is even found.)
What you want is "cross-module inlining".
As far as I know, DMD and GDC will do cross-module inlining (if
inlining is profitable).
LDC does not, unless `-enable-cross-module-inlining` is enabled
(which is aggressive and may result in linking errors in specific
cases, https://github.com/ldc-developers/ldc/pull/1737).
LDC with LTO enabled will definitely give you cross-module
inlining (also for private functions).
You can force inlining with `pragma(inline, true)`, but it is
usually better to leave that decision up to the compiler.
https://dlang.org/spec/pragma.html#inline
-Johan