-fsection-anchors broken on ARM

Iain Buclaw ibuclaw at ubuntu.com
Thu May 9 10:40:04 PDT 2013


On Wednesday, 8 May 2013 at 11:34:19 UTC, Iain Buclaw wrote:
> On 24 April 2013 15:12, Iain Buclaw <ibuclaw at ubuntu.com> wrote:
>
>> On 23 April 2013 18:25, Iain Buclaw <ibuclaw at ubuntu.com> wrote:
>>
>>> On 23 April 2013 17:28, Johannes Pfau <nospam at example.com> 
>>> wrote:
>>>
>>>> Am Tue, 23 Apr 2013 17:10:43 +0200
>>>> schrieb "Iain Buclaw" <ibuclaw at ubuntu.com>:
>>>>
>>>> > In reference to this link:
>>>> > http://forum.dlang.org/post/50476C77.20608@googlemail.com
>>>> >
>>>> >
>>>> > I'm currently working on dealing with each of these issues 
>>>> > in the
>>>> > following pull (with the intention to merge back upstream 
>>>> > where
>>>> > required).
>>>> > https://github.com/D-Programming-GDC/GDC/pull/62
>>>> >
>>>> I'll make sure to have a look at this, but as always too 
>>>> little time...
>>>>
>>>> > In order:
>>>> >
>>>> > 1. ClassInfo
>>>> >
>>>> > The initialiser emitted will have two symbols, one public 
>>>> > symbol
>>>> > with the TypeInfo_Class members, and a second private 
>>>> > generated
>>>> > symbol for the interfaces array.  I can't forsee any way 
>>>> > this
>>>> > could break compatibility with any existing compilied gdc 
>>>> > (or
>>>> > perhaps even dmd/ldc) binaries out there.
>>>>
>>>> Sounds good. That should also be good for debug info.
>>>>
>>>>
>>> Actually, found an interesting problem when confronting it.
>>>
>>> ---
>>> struct Interface
>>> {
>>>     TypeInfo_Class   classinfo;
>>>     void*[]     vtbl;
>>>     ptrdiff_t   offset;     /// offset to Interface 'this' 
>>> from Object
>>> 'this'  <--
>>> }
>>> ---
>>>
>>> I'll have to have a think about what value should be put 
>>> there, and how
>>> best to put it in.
>>>
>>>
>>
>> Or alternatively we could generate the type (for debugging) on 
>> the flying
>> in ::toSymbol
>>
>> 1.  Module::toSymbol.
>>
>> Type = Type::moduleinfo type.
>>
>>
>> 2. ClassDeclaration::toSymbol
>>
>> Type = Type::typeinfoclass type.
>>
>> Then for each interface, add the fields for Type::interface 
>> onto the type.
>>
>>
>> 3. InterfaceDeclaration::toSymbol
>>
>> Likewise to above.
>>
>>
> For the time being in this pull:
>
> https://github.com/D-Programming-GDC/GDC/pull/62
>
> For ModuleInfo, TypeInfoClass and Interface classes, I have 
> added a new
> kind of type node into the glue layer.
>
> - d_unknown_type_node: LANG_TYPE
>
> This means that the backend won't touch, or do any sort of 
> laying out of
> the type.
>
> If we find this type in d_finalize_symbol  (formerly called 
> outdata), then
> we give it the compiler generated type of the initialiser, and 
> for debug
> purposes give it an eponymous type name  (eg:  
> _Dobject_ModuleInfoZ symbol
> has type name struct _Dobject_ModuleInfoZ).
>
> This is fine for the workaround so far, but future improvements 
> would be to
> take the logic from toObjFile / genmoduleinfo and give the 
> fields the
> correct names when generating the symbol in toSymbol.
>
> Alternatively we could store this information within Symbol 
> itself during
> the toObjFile / genmoduleinfo stage, and have d_finalize_symbol 
> call a
> routine that will generate the correct type layout to prevent 
> code
> duplication.
>
>


Also, I have altered the mismatch check in d_finalize_symbol 
(outdata) that you put in initially for this fix.  Now it asserts 
that type_size == initialiser_type_size.

This passes through the testsuite 100%, so I'll keep it.  There 
should be no reason whatsoever why the initialiser would be less 
than the type size.

Regards
Iain


More information about the D.gnu mailing list