[Bug 99] -fsection-anchors broken on ARM
gdc-bugzilla at gdcproject.org
gdc-bugzilla at gdcproject.org
Sat Feb 1 03:02:30 PST 2014
http://bugzilla.gdcproject.org/show_bug.cgi?id=99
--- Comment #1 from Mike <slavo5150 at yahoo.com> 2014-02-01 11:02:30 GMT ---
Johannes Pfau - 2011-10-05
******************************************
OK, the ClassZ size is bigger as the class implements an interface. This code
interface A {}
class B : A {}
compiled with gdc -c -S test.d produces this
.LC1:
.ascii "test2.B\000"
.data
.align 2
.type _D5test21B7__ClassZ, %object
.size _D5test21B7__ClassZ, 76
_D5test21B7__ClassZ:
.word _D14TypeInfo_Class6__vtblZ
.word 0
.word 12
.word _D5test21B6__initZ
.word 7
.word .LC1
.word 6
.word _D5test21B6__vtblZ
.word 1
.word _D5test21B7__ClassZ+76
.word _D6Object7__ClassZ
.word 0
.word 0
.word 54
.word 0
.word 0
.word 0
.word 0
.word 0
.word _D5test21A11__InterfaceZ
.word 1
.word _D5test21B7__ClassZ+92
.word 8
.word _D5test21B7__ClassZ+76
I'm concerned about this line:
.size _D5test21B7__ClassZ, 76
as size is not 76, even in this simple example it's 96. I'm not sure if the
wrong size at this position is a problem, but it seems likely that it causes
the issues with anchors: Simply making DefaultTraceInfo a 'normal' class (not
implementing an interface) makes the problem go away.
Iain Buclaw - 2011-10-06
******************************************
The issue here is slightly different:
sizeof B == 76
sizeof B.init.type == 96
Johannes Pfau - 2011-11-20
******************************************
Sorry I don't understand your last answer 100%. sizeof B and sizeof B.init.type
are meant to be the same, aren't they? So we'd have to research why those are
different / how to fix that?
Anonymous - 2012-06-12
******************************************
OK, it's been 6 months since I last looked at this, so another try :-)
I diffed the asm output of the core.runtime.d file with sections anchors
enabled and with section anchors disabled. I then ported the changes from the
no-anchor one to the anchor one, till the anchor one worked. I then removed the
changes again, one by one, to find the minimal difference causing the issue.
Turns out, this little asm sequence in function _D4core7runtime9modinitFZv
causes the issue:
- movw r3, #:lower16:.LANCHOR1
- movt r3, #:upper16:.LANCHOR1
+ movw r3, #:lower16:__mod_ref.1703
+ movt r3, #:upper16:__mod_ref.1703
ldr r1, [r2, #0]
- str r1, [r3, #76]!
str r3, [r2, #0]
+ str r1, [r3, #0]
This code is correct, but LANCHOR1+76 != __mod_ref.1703 .
LANCHOR1 is defined here:
.LANCHOR1 = . + 0
.type
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7__ClassZ,
%object
.size
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7__ClassZ,
76
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7__ClassZ:
.word _D14TypeInfo_Class6__vtblZ
.word 0
.word 4120
.word
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo6__initZ
.word 49
.word .LC1
.word 8
.word
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo6__vtblZ
.word 1
.word
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7__ClassZ+76
.word _D6Object7__ClassZ
.word
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo6__dtorMFZv
.word 0
.word 60
.word 0
.word 0
.word 0
.word
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo6__ctorMFZC4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo
.word 0
.word _D6object9Throwable9TraceInfo11__InterfaceZ
.word 4
.word
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7__ClassZ+92
.word 4116
.word
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7__ClassZ+76
.word ___t.0.1647
.word ___t.1.1648
.word ___t.2.1649
.type __mod_ref.1703, %object
.size __mod_ref.1703, 8
__mod_ref.1703:
So the +76 in the anchor code is caused by this line:
.size
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7__ClassZ,
76
this is wrong, size of
_D4core7runtime19defaultTraceHandlerFPvZC6object9Throwable9TraceInfo16DefaultTraceInfo7ClassZ
isn't 76 it's 108.
However, the size classinfo is fixed to CLASSINFO_SIZE and must be 76. Those
additional 32 bytes is the interfaces[] array (see toobj.c).
The dmd source (toobj.c, ClassDeclaration::toObjFile(int multiobj)) says
// Put out vtblInterfaces->data[]. Must immediately follow csym, because
// of the fixup (*)
and
// Put out the vtblInterfaces->data[].vtbl[]
// This must be mirrored with ClassDeclaration::baseVtblOffset()
so it seems this is correct and can't be changed in an easy way. We have to
make sure GDC doesn't output 76 as the symbols size, but the correct complete
size including the interface table. I guess the size is output by the call to
toSymbol(); in toobj.c: ClassDeclaration::toObjFile which I guess calls
ClassDeclaration::toSymbol() in the end?
Johannes Pfau - 2012-09-06
******************************************
After some more investigation it seems this needs to be fixed in the front end.
I posted a detailed message to the dmd-internals list here:
http://forum.dlang.org/thread/50476C77.20608@googlemail.com
--
Configure bugmail: http://bugzilla.gdcproject.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching all bug changes.
More information about the D.gnu
mailing list