On Thursday, 14 August 2014 at 19:05:46 UTC, Johannes Pfau wrote:
Am Thu, 14 Aug 2014 17:53:32 +0000
schrieb "Timo Sintonen" <t.sinto...@luukku.com>:
On Thursday, 14 August 2014 at 17:13:23 UTC, Johannes Pfau
wrote:
> Am Thu, 14 Aug 2014 10:07:04 +0000
> schrieb "Timo Sintonen" <t.sinto...@luukku.com>:
>
>> I have been looking at object files to see if I can reduce
>> the memory usage for minimum systems. There are two things
>> I have noticed:
>>
>> 1. In the data segment there is some source code as ascii
>> text from a template in gcc/atomics.d . This is in the
>> actual data segment and not in debug info segments and goes
>> into the data segment of the executable. I do not see any
>> code using this data. Why is this in the executable and is
>> it possible to remove it?
>>
>
> Strange, could you post a testcase?
It seems this comes from libdruntime and it exists in object.o
and core/atomic.o, Testcase is to compile minlibd library as
it is currently in the repo using the makefile as such.
But I think it will be in any object file that imports
gcc.atomics and uses the template in there.
If you're referring to this:
http://dpaste.dzfl.pl/fe75e8c7dfca
This seems to be the const variable in __sync_op_and. Try to
change the
code to "immutable __sync_op_and = " or "enum __sync_op_and = "
and
file a bug report.
>
>> 2. In the data segment there is also __init for all types.
>> I assume that they contain the initial values that are
>> copied when a new object of this type is created.
>
> Correct, it's for '.init' (there's especially
> __..._TypeInfo_init which
> is the initializer for typeinfo. I've implemented -fno-rtti
> in a private
> git branch to get rid of typeinfo)
>
>> Is this data mutable and should it really be in data
>> segment and not in rodata?
>>
>
> I think it should be in rodata.
So it is not a bug and not a feature. It is just because it
does not matter? Maybe a feature request?
Seems to happen only for the TypeInfo init symbols. I can't run
the
testsuite right now, but try this:
diff --git a/gcc/d/d-decls.cc b/gcc/d/d-decls.cc
index bd6f5f9..45d433a 100644
--- a/gcc/d/d-decls.cc
+++ b/gcc/d/d-decls.cc
@@ -274,6 +274,8 @@ TypeInfoDeclaration::toSymbol (void)
// given TypeInfo. It is the actual data, not a
reference
gcc_assert (TREE_CODE (TREE_TYPE (csym->Stree)) ==
REFERENCE_TYPE); TREE_TYPE (csym->Stree) = TREE_TYPE (TREE_TYPE
(csym->Stree));
+ TREE_CONSTANT (csym->Stree) = true;
+ TREE_READONLY (csym->Stree) = true;
relayout_decl (csym->Stree);
TREE_USED (csym->Stree) = 1;
Looks good. Template code is gone and init blocks have moved to
rodata. My simple test program compiles and runs.
There is still some __Class in data segment and init values for
structs and arrays in bss segment. Is it possible to move these
to rodata too?
In my application there will be several large structs. I never
create anything of these types. Instead I use them to point to
hardware registers and maybe on top of existing byte arrays like
message buffers. There will still be initial values for these
structs wasting memory. Is there any way to omit them?