Hi,
could a gatekeeper please help review the fix for bug968?
(https://bugs.open64.net/show_bug.cgi?id=968)
[lwzhang@cario align]$ cat align1.c
int aaa[15]={0};
__attribute__((aligned(1024))) unsigned char test_align[2000]={0};
int bbb[15]={0};
__attribute__((aligned(1024))) unsigned char test_align11[1030]={0};
int ccc[15]={0};
int main()
{
memset(ccc, 0, sizeof(ccc));
memset(test_align, 0, sizeof(test_align));
memset(test_align11, 0, sizeof(test_align11));
}
[lwzhang@cario align]$ opencc align1.c -o a1 -keep
[lwzhang@cario align]$ vi align1.s
......
In align1.s:
24 .section .bss
25 .org 0x0
26 .align 0
27 .globl ccc
28 .type ccc, @object
29 .size ccc, 60
30 ccc: # 0x0
31 .skip 1024
32 .org 0x400
33 .align 0
34 .globl test_align
35 .type test_align, @object
36 .size test_align, 2000
37 test_align: # 0x400
38 .skip 2048
39 .org 0xc00
40 .align 0
41 .globl test_align11
42 .type test_align11, @object
43 .size test_align11, 1030
44 test_align11: # 0xc00
45 .skip 2048
46 .org 0x1400
47 .align 0
48 .globl aaa
49 .type aaa, @object
50 .size aaa, 60
51 aaa: # 0x1400
52 .skip 64
53 .org 0x1440
54 .align 0
55 .globl bbb
56 .type bbb, @object
57 .size bbb, 60
58 bbb: # 0x1440
59 .skip 60
......
(1)Problem:
For variable 'aaa': .org 0x1400 that means 'aaa''s align is same with
the
last variable 'test_align11' 1024.
But 'aaa''s align should be 16, not 1024. So here align for 'aaa' is wrong.
(2)Analysis:
From the source code of open64, I found the reason as follows:
Data_layout.cxx:
static void
Allocate_Space(ST *base, ST *blk, INT32 lpad, INT32 rpad, INT64 maxsize)
{
..
if (!STB_decrement(base)) {
old_offset = STB_size(base);
Set_ST_ofst(blk, ROUNDUP(old_offset + lpad, align));
Set_STB_size(base, ROUNDUP(ST_ofst(blk) + size + rpad, align));
}
else {
old_offset = STB_size(base);
/* align object end */
Set_ST_ofst(blk, ROUNDUP(old_offset + lpad, align));
Set_ST_ofst(blk,
-(INT64) ROUNDUP(ST_ofst(blk) + size + rpad, align)); /* start */
Set_STB_size(base, -ST_ofst(blk));
}
..
}
For variable 'test_align11', it's offset is 0xc00, and the .bss size
update to 0x1400. Then for 'aaa', it's offset is .bss size, that is 0x1400.
It's wrong.
The reason is that after allocating space for 'test_align11', .bss size
update align with current variable's align.
I think it should update by adding current variable's size without any
align.
(3)Patch:
Index: data_layout.cxx
===================================================================
--- data_layout.cxx (revision 3916)
+++ data_layout.cxx (working copy)
@@ -679,12 +679,13 @@
if (!STB_decrement(base)) {
old_offset = STB_size(base);
Set_ST_ofst(blk, ROUNDUP(old_offset + lpad, align));
- Set_STB_size(base, ROUNDUP(ST_ofst(blk) + size + rpad, align));
+ Set_STB_size(base, ST_ofst(blk) + size + rpad);
}
else {
old_offset = STB_size(base);
/* align object end */
- Set_ST_ofst(blk, ROUNDUP(old_offset + lpad, align));
+ /* open64.net bug968: here need not align object end */
+ Set_ST_ofst(blk, old_offset + lpad);
Set_ST_ofst(blk,
-(INT64) ROUNDUP(ST_ofst(blk) + size + rpad, align)); /* start */
Set_STB_size(base, -ST_ofst(blk));
Best wishes,
ZhangLiwei
------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel