Our analysis suggests that reducing certain stabs info for C++ ctors/
dtors can lead to significant final size reduction without noticeable
change in quality of debugging (in STABS world, at least).
For example,
class Base1 {
public: int x;
Base1(int i) { x = i; }
int getx (void) { return x; }
};
int main () {
Base1 myobj(5);
return myobj.getx();
}
will emit a class definition LSYM of
.stabs "Base1:Tt(0,41)=s4x:(0,9),0,32;__base_ctor ::(0,42)=#
(0,41),(0,36),(0,43)=*(0,41),(0,9),(0,36);:_ZN5Base1C2Ei;
2A.;__comp_ctor ::(0,42):_ZN5Base1C1Ei;2A.;getx::(0,44)=#(0,41),(0,9),
(0,43),(0,36);:_ZN5Base14getxEv;2A.;;",128,0,1,0
However, it is good enough to have
.stabs "Base1:Tt(0,41)=s4x:(0,9),0,32;getx::(0,44)=#(0,41),
(0,9),(0,43)=*(0,41),(0,36);:_ZN5Base14getxEv;2A.;;",128,0,1,0
and keep the stabs for the cdtors in other contexts, most obviously
the FUN stab where the function is defined. e.g.
__ZN5Base1C1Ei:
.stabd 46,0,0
.stabd 68,0,3
LFB4:
stmw r30,-8(r1)
[...]
lmw r30,-8(r1)
blr
LFE4:
.stabs "_ZN5Base1C1Ei:F(0,36)",36,0,3,__ZN5Base1C1Ei
.stabs "this:p(0,45)=k(0,43)",160,0,3,72
.stabs "i:p(0,9)",160,0,3,76
Lscope0:
.stabs "",36,0,0,Lscope0-__ZN5Base1C1Ei
.stabd 78,0,0
Our GDB folks are still analyzing compiler output with included
patch. Initial response is - it looks good. I'd like to get your
feedback on this. Is it a good idea in general for other debugging
formats also ?
If peopler thinks this is a good idea then I can prepare patch for
mainline. Do we need a switch to control this ? I do not know. If
you can think of better name for this switch, feel free to suggest.
-
Devang
[ I am intentionally including this patch to make it easier to read.
This patch is against apple-local branch so it may not apply cleanly
to FSF mainline. As I said, if this looks good then I'll prepare
actual patch. ]
Index: c-common.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-common.c,v
retrieving revision 1.604.2.12
diff -Idpatel.pbxuser -c -3 -p -r1.604.2.12 c-common.c
*** c-common.c 15 Jun 2005 16:18:32 -0000 1.604.2.12
--- c-common.c 11 Jul 2005 21:34:24 -0000
*************** int flag_access_control = 1;
*** 454,459 ****
--- 454,463 ----
int flag_check_new;
+ /* APPLE LOCAL begin 4167759 */
+ /* Nonzero if we want to omit debug info for certain constructors and
+ destructors. */
+ int flag_compact_debug_info;
/* Nonzero if we want the new ISO rules for pushing a new scope
for `for'
initialization variables.
0: Old rules, set by -fno-for-scope.
Index: c-common.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-common.h,v
retrieving revision 1.276.6.9
diff -Idpatel.pbxuser -c -3 -p -r1.276.6.9 c-common.h
*** c-common.h 23 Jun 2005 01:30:09 -0000 1.276.6.9
--- c-common.h 11 Jul 2005 21:34:24 -0000
*************** extern int flag_access_control;
*** 579,584 ****
--- 579,589 ----
extern int flag_check_new;
+ /* APPLE LOCAL begin 4167759 */
+ /* Nonzero if we want to omit debug info for certain constructors and
+ destructors. */
+ extern int flag_compact_debug_info;
+ /* APPLE LOCAL end 4167759 */
/* Nonzero if we want the new ISO rules for pushing a new scope
for `for'
initialization variables.
0: Old rules, set by -fno-for-scope.
Index: c-opts.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-opts.c,v
retrieving revision 1.135.6.8
diff -Idpatel.pbxuser -c -3 -p -r1.135.6.8 c-opts.c
*** c-opts.c 1 Jul 2005 00:01:07 -0000 1.135.6.8
--- c-opts.c 11 Jul 2005 21:34:24 -0000
*************** c_common_handle_option (size_t scode, co
*** 688,693 ****
--- 688,698 ----
flag_check_new = value;
break;
+ /* APPLE LOCAL begin 4167759 */
+ case OPT_fcompact_debug_info:
+ flag_compact_debug_info = value;
+ break;
+ /* APPLE LOCAL end 4167759 */
case OPT_fconserve_space:
flag_conserve_space = value;
break;
Index: c.opt
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c.opt,v
retrieving revision 1.34.6.8
diff -Idpatel.pbxuser -c -3 -p -r1.34.6.8 c.opt
*** c.opt 1 Jul 2005 00:01:08 -0000 1.34.6.8
--- c.opt 11 Jul 2005 21:34:24 -0000
*************** fcheck-new
*** 572,577 ****
--- 572,583 ----
C++ ObjC++
Check the return value of new
+ ; APPLE LOCAL begin 4167759
+ fcompact-debug-info
+ C ObjC C++ ObjC++
+ Avoid verbose debug info related to constructors and destructors
+ ; APPLE LOCAL end 4167759
+
; APPLE LOCAL begin structor decloning
fclone-structors
C++ ObjC++
Index: cp/class.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/class.c,v
retrieving revision 1.705.2.4
diff -Idpatel.pbxuser -c -3 -p -r1.705.2.4 class.c
*** cp/class.c 10 Jun 2005 18:46:07 -0000 1.705.2.4
--- cp/class.c 11 Jul 2005 21:34:25 -0000
*************** build_clone (tree fn, tree name)
*** 3768,3773 ****
--- 3768,3785 ----
DECL_VINDEX (clone) = NULL_TREE;
}
+ /* APPLE LOCAL begin 4167759 */
+ if (flag_compact_debug_info)
+ {
+ if (name == base_ctor_identifier
+ || name == complete_ctor_identifier
+ || name == complete_dtor_identifier
+ || name == base_dtor_identifier
+ || name == deleting_dtor_identifier)
+ DECL_IGNORED_P (clone) = 1;
+ }
+ /* APPLE LOCAL end 4167759 */
+
/* If there was an in-charge parameter, drop it from the function
type. */
if (DECL_HAS_IN_CHARGE_PARM_P (clone))
Index: cp/semantics.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/semantics.c,v
retrieving revision 1.460.4.7
diff -Idpatel.pbxuser -c -3 -p -r1.460.4.7 semantics.c
*** cp/semantics.c 10 Jun 2005 18:46:22 -0000 1.460.4.7
--- cp/semantics.c 11 Jul 2005 21:34:26 -0000
*************** expand_body (tree fn)
*** 3015,3020 ****
--- 3015,3026 ----
generating trees for a function. */
gcc_assert (function_depth == 0);
+ /* APPLE LOCAL begin 4167759 */
+ if (DECL_NAME (fn) == complete_ctor_identifier
+ || DECL_NAME (fn) == complete_dtor_identifier)
+ DECL_IGNORED_P (fn) = 0;
+ /* APPLE LOCAL end 4167759 */
+
tree_rest_of_compilation (fn);
current_function_decl = saved_function;