Browse Source

+ -go<x> switch for debugging options (some global switches could be
moved to it)
+ -go[no]dwarfsets switch to [disable]/enable generation of dwarf set
information, as this breaks gdb < 6.5 (used to be disabled in the
compiler by an ifdef, still off by default)

git-svn-id: trunk@8414 -

Jonas Maebe 18 years ago
parent
commit
488cfa3c32
7 changed files with 160 additions and 87 deletions
  1. 29 27
      compiler/dbgdwarf.pas
  2. 45 0
      compiler/globals.pas
  3. 13 0
      compiler/globtype.pas
  4. 2 0
      compiler/msg/errore.msg
  5. 1 1
      compiler/msgidx.inc
  6. 64 59
      compiler/msgtxt.inc
  7. 6 0
      compiler/options.pas

+ 29 - 27
compiler/dbgdwarf.pas

@@ -2779,35 +2779,37 @@ implementation
 
     procedure TDebugInfoDwarf2.appenddef_set(def: tsetdef);
       begin
-{$ifdef GDB_SUPPORTS_DWARF_SETS}
-        { current (20070704 -- patch was committed on 20060513) gdb cvs supports set types }
-
-        if assigned(def.typesym) then
-          append_entry(DW_TAG_set_type,false,[
-            DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
-            DW_AT_byte_size,DW_FORM_data2,def.size
-            ])
-        else
-          append_entry(DW_TAG_set_type,false,[
-            DW_AT_byte_size,DW_FORM_data2,def.size
-            ]);
-        append_labelentry_ref(DW_AT_type,def_dwarf_lab(def.elementdef));
-{$else GDB_SUPPORTS_DWARF_SETS}
-        { at least gdb up to 6.4 doesn't support sets in dwarf, there is a patch available to fix this:
-          http://sources.redhat.com/ml/gdb-patches/2005-05/msg00278.html (FK) }
+        if (ds_dwarf_sets in current_settings.debugswitches) then
+          begin
+            { current (20070704 -- patch was committed on 20060513) gdb cvs supports set types }
 
-        if assigned(def.typesym) then
-          append_entry(DW_TAG_base_type,false,[
-            DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
-            DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned,
-            DW_AT_byte_size,DW_FORM_data2,def.size
-            ])
+            if assigned(def.typesym) then
+              append_entry(DW_TAG_set_type,false,[
+                DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
+                DW_AT_byte_size,DW_FORM_data2,def.size
+                ])
+            else
+              append_entry(DW_TAG_set_type,false,[
+                DW_AT_byte_size,DW_FORM_data2,def.size
+                ]);
+            append_labelentry_ref(DW_AT_type,def_dwarf_lab(def.elementdef));
+          end
         else
-          append_entry(DW_TAG_base_type,false,[
-            DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned,
-            DW_AT_byte_size,DW_FORM_data2,def.size
-            ]);
-{$endif GDB_SUPPORTS_DWARF_SETS}
+          begin
+            { gdb versions which don't support sets refuse to load the debug }
+            { info of modules that contain set tags                          }
+            if assigned(def.typesym) then
+              append_entry(DW_TAG_base_type,false,[
+                DW_AT_name,DW_FORM_string,symname(def.typesym)+#0,
+                DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned,
+                DW_AT_byte_size,DW_FORM_data2,def.size
+                ])
+            else
+              append_entry(DW_TAG_base_type,false,[
+                DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned,
+                DW_AT_byte_size,DW_FORM_data2,def.size
+                ]);
+          end;
         finish_entry;
       end;
 

+ 45 - 0
compiler/globals.pas

@@ -110,6 +110,7 @@ interface
          localswitches   : tlocalswitches;
          modeswitches    : tmodeswitches;
          optimizerswitches : toptimizerswitches;
+         debugswitches   : tdebugswitches;
          { 0: old behaviour for sets <=256 elements
            >0: round to this size }
          setalloc,
@@ -335,6 +336,7 @@ interface
     function SetFpuType(const s:string;var a:tfputype):boolean;
     function UpdateAlignmentStr(s:string;var a:talignmentinfo):boolean;
     function UpdateOptimizerStr(s:string;var a:toptimizerswitches):boolean;
+    function UpdateDebugStr(s:string;var a:tdebugswitches):boolean;
     function IncludeFeature(const s : string) : boolean;
     function SetMinFPConstPrec(const s: string; var a: tfloattype) : boolean;
 
@@ -971,6 +973,48 @@ implementation
       end;
 
 
+    function UpdateDebugStr(s:string;var a:tdebugswitches):boolean;
+      var
+        tok   : string;
+        doset,
+        found : boolean;
+        opt   : tdebugswitch;
+      begin
+        result:=true;
+        uppervar(s);
+        repeat
+          tok:=GetToken(s,',');
+          if tok='' then
+           break;
+          if Copy(tok,1,2)='NO' then
+            begin
+              delete(tok,1,2);
+              doset:=false;
+            end
+          else
+            doset:=true;
+          found:=false;
+          for opt:=low(tdebugswitch) to high(tdebugswitch) do
+            begin
+              if DebugSwitchStr[opt]=tok then
+                begin
+                  found:=true;
+                  break;
+                end;
+            end;
+          if found then
+            begin
+              if doset then
+                include(a,opt)
+              else
+                exclude(a,opt);
+            end
+          else
+            result:=false;
+        until false;
+      end;
+
+
     function IncludeFeature(const s : string) : boolean;
       var
         i : tfeature;
@@ -1170,6 +1214,7 @@ implementation
         init_settings.moduleswitches:=[cs_extsyntax,cs_implicit_exceptions];
         init_settings.globalswitches:=[cs_check_unit_name,cs_link_static];
         init_settings.optimizerswitches:=[];
+        init_settings.debugswitches:=[];
         init_settings.sourcecodepage:='8859-1';
         init_settings.packenum:=4;
         init_settings.setalloc:=0;

+ 13 - 0
compiler/globtype.pas

@@ -133,6 +133,16 @@ interface
        );
        tglobalswitches = set of tglobalswitch;
 
+       { global switches specific to debug information }
+       tdebugswitch = (ds_none,
+          { enable set support in dwarf debug info, breaks gdb versions }
+          { without support for that tag (they refuse to parse the rest }
+          { of the debug information)                                   }
+          ds_dwarf_sets
+       );
+       tdebugswitches = set of tdebugswitch;
+       
+
        { adding a new entry here requires also adding the appropriate define in
          systemh.inc (FK)
        }
@@ -161,6 +171,9 @@ interface
          'PEEPHOLE','ASMCSE','LOOPUNROLL','TAILREC','CSE','DFA'
        );
 
+       DebugSwitchStr : array[tdebugswitch] of string[9] = ('',
+         'DWARFSETS');
+
        { switches being applied to all CPUs at the given level }
        genericlevel1optimizerswitches = [cs_opt_level1];
        genericlevel2optimizerswitches = [cs_opt_level2];

+ 2 - 0
compiler/msg/errore.msg

@@ -2544,6 +2544,8 @@ S*2Aas_Assemble using GNU AS
 *g2gg_Use gsym
 *g2gh_Use heaptrace unit (for memory leak/corruption debugging)
 *g2gl_Use line info unit (show more info with backtraces)
+*g2go<x>_Set debug information options
+*g3godwarfsets_ Enable Dwarf set debug information (breaks gdb < 6.5)
 *g2gp_Preserve case in stabs symbol names
 *g2gs_Generate stabs debug information
 *g2gt_Trash local variables (to detect uninitialized uses)

+ 1 - 1
compiler/msgidx.inc

@@ -731,7 +731,7 @@ const
   option_info=11024;
   option_help_pages=11025;
 
-  MsgTxtSize = 45067;
+  MsgTxtSize = 45176;
 
   MsgIdxMax : array[1..20] of longint=(
     24,86,237,83,63,49,107,22,135,60,

+ 64 - 59
compiler/msgtxt.inc

@@ -1,7 +1,7 @@
 {$ifdef Delphi}
-const msgtxt : array[0..000187] of string[240]=(
+const msgtxt : array[0..000188] of string[240]=(
 {$else Delphi}
-const msgtxt : array[0..000187,1..240] of char=(
+const msgtxt : array[0..000188,1..240] of char=(
 {$endif Delphi}
   '01000_T_Compiler: $1'#000+
   '01001_D_Compiler OS: $1'#000+
@@ -921,163 +921,168 @@ const msgtxt : array[0..000187,1..240] of char=(
   '*g2gg_Use gsym'#010+
   '*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
   '*g2gl_Use line info unit (show more info with backtraces)'#010+
+  '*g2go<x>_Set debug information options'#010+
+  '*g3godwarfsets_ Enable Dwarf set deb','ug information (breaks gdb < 6.5'+
+  ')'#010+
   '*g2gp_Preserve case in stabs symbol names'#010+
-  '*g2gs_Generate stabs debug inform','ation'#010+
+  '*g2gs_Generate stabs debug information'#010+
   '*g2gt_Trash local variables (to detect uninitialized uses)'#010+
   '*g2gv_Generates programs traceable with valgrind'#010+
-  '*g2gw_Generate dwarf-2 debug information (same as -gw2)'#010+
+  '*g2gw_Generate dw','arf-2 debug information (same as -gw2)'#010+
   '*g2gw2_Generate dwarf-2 debug information'#010+
-  '*g2gw3_Generate dwarf-3 debu','g information'#010+
+  '*g2gw3_Generate dwarf-3 debug information'#010+
   '**1i_Information'#010+
   '**2iD_Return compiler date'#010+
   '**2iV_Return short compiler version'#010+
   '**2iW_Return full compiler version'#010+
-  '**2iSO_Return compiler OS'#010+
+  '**','2iSO_Return compiler OS'#010+
   '**2iSP_Return compiler host processor'#010+
   '**2iTO_Return target OS'#010+
-  '**2iTP_Return target pr','ocessor'#010+
+  '**2iTP_Return target processor'#010+
   '**1I<x>_Add <x> to include path'#010+
   '**1k<x>_Pass <x> to the linker'#010+
   '**1l_Write logo'#010+
   '**1M<x>_Set language mode to <x>'#010+
-  '**2Mfpc_Free Pascal dialect (default)'#010+
+  '**2Mfpc_Fre','e Pascal dialect (default)'#010+
   '**2Mobjfpc_FPC mode with Object Pascal support'#010+
-  '**2Mdelphi_Delphi 7 compatibility m','ode'#010+
+  '**2Mdelphi_Delphi 7 compatibility mode'#010+
   '**2Mtp_TP/BP 7.0 compatibility mode'#010+
   '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
-  '**1n_Do not read the default config files'#010+
+  '**1n_Do not read the default config',' files'#010+
   '**1N<x>_Node tree optimizations'#010+
   '**2Nu_Unroll loops'#010+
-  '**1o<x>_Change the name of the executable produced ','to <x>'#010+
+  '**1o<x>_Change the name of the executable produced to <x>'#010+
   '**1O<x>_Optimizations:'#010+
   '**2O-_Disable optimizations'#010+
   '**2O1_Level 1 optimizations (quick and debugger friendly)'#010+
-  '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
+  '**2O2_Level 2 o','ptimizations (-O1 + quick optimizations)'#010+
   '**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+
-  '**2Oa<x>=<y>_','Set alignment'#010+
+  '**2Oa<x>=<y>_Set alignment'#010+
   '**2Oo[NO]<x>_Enable or disable optimizations, see fpc -i for possible '+
   'values'#010+
-  '**2Op<x>_Set target cpu for optimizing, see fpc -i for possible values'+
-  #010+
+  '**2Op<x>_Set target cpu for optimizing, ','see fpc -i for possible valu'+
+  'es'#010+
   '**2Os_Optimize for size rather than speed'#010+
-  '**1pg_Generate profile code for gpro','f (defines FPC_PROFILE)'#010+
+  '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+
   '**1R<x>_Assembler reading style:'#010+
   '**2Rdefault_Use default assembler for target'#010+
-  '3*2Ratt_Read AT&T style assembler'#010+
+  '3*2Ratt_Read AT&T style assem','bler'#010+
   '3*2Rintel_Read Intel style assembler'#010+
   '6*2RMOT_Read motorola style assembler'#010+
   '**1S<x>_Syntax options:'#010+
-  '**2S2','_Same as -Mobjfpc'#010+
+  '**2S2_Same as -Mobjfpc'#010+
   '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
   '**2Sa_Turn on assertions'#010+
   '**2Sd_Same as -Mdelphi'#010+
-  '**2Se<x>_Error options. <x> is a combination of the following:'#010+
-  '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010,
+  '**2Se<x>_Error o','ptions. <x> is a combination of the following:'#010+
+  '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+
   '**3*_w : Compiler also halts after warnings'#010+
   '**3*_n : Compiler also halts after notes'#010+
   '**3*_h : Compiler also halts after hints'#010+
-  '**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
-  '**2Sh_Use ansistrings by default instead of shortstring','s'#010+
+  '**2Sg','_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
+  '**2Sh_Use ansistrings by default instead of shortstrings'#010+
   '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+
   '**2Sk_Load fpcylix unit'#010+
   '**2SI<x>_Set interface style to <x>'#010+
-  '**3SIcom_COM compatible interface (default)'#010+
+  '*','*3SIcom_COM compatible interface (default)'#010+
   '**3SIcorba_CORBA compatible interface'#010+
-  '**2Sm_Support macros like C ','(global)'#010+
+  '**2Sm_Support macros like C (global)'#010+
   '**2So_Same as -Mtp'#010+
   '**2Ss_Constructor name must be init (destructor must be done)'#010+
   '**2St_Allow static keyword in objects'#010+
-  '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
+  '**2','Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
   '**1s_Do not call assembler and linker'#010+
-  '**2sh_Gen','erate script to link on host'#010+
+  '**2sh_Generate script to link on host'#010+
   '**2st_Generate script to link on target'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
-  '**1T<x>_Target operating system:'#010+
+  '**1T<x>_T','arget operating system:'#010+
   '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
   '3*2Tfreebsd_FreeBSD'#010+
-  '3*2Tgo32v2_Vers','ion 2 of DJ Delorie DOS extender'#010+
+  '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tnetbsd_NetBSD'#010+
   '3*2Tnetware_Novell Netware Module (clib)'#010+
-  '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
+  '3*2Tnetwlibc_Novell Net','ware Module (libc)'#010+
   '3*2Topenbsd_OpenBSD'#010+
   '3*2Tos2_OS/2 / eComStation'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
-  '3*2Twatcom_Watcom c','ompatible DOS extender'#010+
+  '3*2Twatcom_Watcom compatible DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twince_Windows CE'#010+
   '4*2Tlinux_Linux'#010+
-  '6*2Tamiga_Commodore Amiga'#010+
+  '6*2Tamiga_Commodo','re Amiga'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
   '6*2Tlinux_Linux/m68k'#010+
   '6*2Tmacos_Macintosh m68k (not supported)'#010+
-  '6*2Tpalmos_P','almOS'#010+
+  '6*2Tpalmos_PalmOS'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Twince_Windows CE'#010+
   'P*2Tamiga_AmigaOS on PowerPC'#010+
   'P*2Tdarwin_Darwin and Mac OS X on PowerPC'#010+
-  'P*2Tlinux_Linux on PowerPC'#010+
+  'P*2Tlinux_Linux o','n PowerPC'#010+
   'P*2Tmacos_Mac OS (classic) on PowerPC'#010+
   'P*2Tmorphos_MorphOS'#010+
   'S*2Tlinux_Linux'#010+
-  '**1u<x>_undefines the sym','bol <x>'#010+
+  '**1u<x>_undefines the symbol <x>'#010+
   '**1U_unit options:'#010+
   '**2Un_Do not check where the unit name matches the file name'#010+
-  '**2Ur_Generate release unit files (never automatically recompiled)'#010+
+  '**2Ur_Generate release unit files (never au','tomatically recompiled)'#010+
   '**2Us_Compile a system unit'#010+
-  '**1v<x>_Be verbose. <x> is a combination of the following',' letters:'#010+
+  '**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
   '**2*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
-  '**2*_w : Show warnings               u : Show unit info'#010+
+  '**2*_w : Show warnings               u : Show unit ','info'#010+
   '**2*_n : Show notes                  t : Show tried/used files'#010+
-  '**2*_h : Show hints                  c : ','Show conditionals'#010+
+  '**2*_h : Show hints                  c : Show conditionals'#010+
   '**2*_i : Show general info           d : Show debug info'#010+
-  '**2*_l : Show linenumbers            r : Rhide/GCC compatibility mode'#010+
+  '**2*_l : Show linenumbers            r : Rhide/GCC compa','tibility mod'+
+  'e'#010+
   '**2*_a : Show everything             x : Executable info (Win32 only)'#010+
-  '**2*_b : Write file names',' messages with full path'#010+
+  '**2*_b : Write file names messages with full path'#010+
   '**2*_v : write fpcdebug.txt with     p : Write tree.log with parse tre'+
   'e'#010+
   '**2*_    lots of debugging info'#010+
-  '3*1W<x>_Target-specific options (targets)'#010+
+  '3*','1W<x>_Target-specific options (targets)'#010+
   'A*1W<x>_Target-specific options (targets)'#010+
-  'P*1W<x>_Target-specific opt','ions (targets)'#010+
+  'P*1W<x>_Target-specific options (targets)'#010+
   '3*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'P*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  'p*2Wb_Create a bundle instead of a library (Darwin)'#010+
+  'p*2Wb_Create',' a bundle instead of a library (Darwin)'#010+
   '3*2WB_Create a relocatable image (Windows)'#010+
-  'A*2WB_Create a relocatable',' image (Windows, Symbian)'#010+
+  'A*2WB_Create a relocatable image (Windows, Symbian)'#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
-  'A*2WC_Specify console type application (Windows)'#010+
+  'A*2WC_Specify console type application (Windo','ws)'#010+
   'P*2WC_Specify console type application (Classic Mac OS)'#010+
-  '3*2WD_Use DEFFILE to export functions of DLL or E','XE (Windows)'#010+
+  '3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   '3*2WF_Specify full-screen type application (EMX, OS/2)'#010+
-  '3*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
+  '3','*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
   'A*2WG_Specify graphic type application (Windows)'#010+
-  'P','*2WG_Specify graphic type application (Classic Mac OS)'#010+
+  'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
   '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
-  'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
+  'A*2WN_','Do not generate relocation code, needed for debugging (Windows'+
+  ')'#010+
   '3*2WR_Generate relocation code (Windows)'#010+
-  'A*2W','R_Generate relocation code (Windows)'#010+
+  'A*2WR_Generate relocation code (Windows)'#010+
   'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
   '**1X_Executable options:'#010+
-  '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
-  'ux)'#010+
-  '**2Xd_Do not use standard library search path (','needed for cross comp'+
-  'ile)'#010+
+  '**2Xc_Pass -','-shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, L'+
+  'inux)'#010+
+  '**2Xd_Do not use standard library search path (needed for cross compil'+
+  'e)'#010+
   '**2Xe_Use external linker'#010+
   '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC)'#010+
-  '**2Xi_Use internal linker'#010+
+  '**2Xi_Use i','nternal linker'#010+
   '**2Xm_Generate link map'#010+
   '**2XM<x>_Set the name of the '#039'main'#039' program routine (default i'+
-  's '#039'main'#039,')'#010+
+  's '#039'main'#039')'#010+
   '**2XP<x>_Prepend the binutils names with the prefix <x>'#010+
   '**2Xr<x>_Set library search path to <x> (needed for cross compile)'#010+
-  '**2Xs_Strip all symbols from executable'#010+
+  '**2Xs_','Strip all symbols from executable'#010+
   '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
-  '**2Xt','_Link with static libraries (-static is passed to linker)'#010+
+  '**2Xt_Link with static libraries (-static is passed to linker)'#010+
   '**2XX_Try to smartlink units             (defines FPC_LINK_SMART)'#010+
   '**1*_'#010+
-  '**1?_Show this help'#010+
+  '*','*1?_Show this help'#010+
   '**1h_Shows this help without waiting'#000
 );

+ 6 - 0
compiler/options.pas

@@ -833,6 +833,12 @@ begin
                          else
                            include(init_settings.globalswitches,cs_use_lineinfo);
                        end;
+                     'o' :
+                       begin
+                         if not UpdateDebugStr(copy(more,j+1,length(more)),init_settings.debugswitches) then
+                           IllegalPara(opt);
+                         break;
+                       end;
                      'p' :
                        begin
                          if UnsetBool(More, j) then