Pārlūkot izejas kodu

Merged revisions 7935,7945,7953,7957,7961,7967,7971,7986-7987,7990-7994,7998-8000,8004-8006,8008-8012,8016,8027,8034,8036-8037,8039,8044,8046,8048,8051,8060,8071,8075-8076,8082-8083,8087-8089,8095-8096,8099-8100,8136,8187,8190,8203,8206-8207,8212-8213,8215,8225,8227,8233-8239,8262,8302,8307,8309,8316,8318-8319,8336,8338-8340,8404,8410-8411,8414,8417,8419,8428 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r7935 | jonas | 2007-07-03 20:21:17 +0200 (Tue, 03 Jul 2007) | 2 lines

+ support for bitpacked records in dwarf debug info
........
r7945 | jonas | 2007-07-04 10:14:48 +0200 (Wed, 04 Jul 2007) | 2 lines

- removed tai_file/tai_loc, no longer needed
........
r7957 | jonas | 2007-07-05 15:17:27 +0200 (Thu, 05 Jul 2007) | 5 lines

+ "set" support in dwarf debug info if compiler is compiled with
-dGDB_SUPPORTS_DWARF_SETS (not default, because supported only as of
gdb 6.6, and earlier versions refuse to debug programs containing
DW_TAG_set_type tags)
........
r8414 | jonas | 2007-09-09 11:27:49 +0200 (Sun, 09 Sep 2007) | 6 lines

+ -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)
........
r8417 | jonas | 2007-09-09 15:51:30 +0200 (Sun, 09 Sep 2007) | 4 lines

* properly set the "current compilation directory" (all included files
are relative to this directory, otherwise include dirs appear twice
in some paths)
........
r8419 | peter | 2007-09-09 16:22:11 +0200 (Sun, 09 Sep 2007) | 2 lines

* remove -gd, use -gw instead
........
r8428 | peter | 2007-09-11 20:12:28 +0200 (Tue, 11 Sep 2007) | 2 lines

* prevent overflow in record size
........

git-svn-id: branches/fixes_2_2@8584 -

peter 18 gadi atpakaļ
vecāks
revīzija
e0535bc778

+ 4 - 120
compiler/aasmtai.pas

@@ -81,11 +81,7 @@ interface
           ait_regalloc,
           ait_tempalloc,
           { used to mark assembler blocks and inlined functions }
-          ait_marker,
-          { new source file (dwarf) }
-          ait_file,
-          { new line/loc in source file (dwarf) }
-          ait_loc
+          ait_marker
           );
 
         taiconst_type = (
@@ -148,9 +144,7 @@ interface
           'cut',
           'regalloc',
           'tempalloc',
-          'marker',
-          'file',
-          'line'
+          'marker'
           );
 
     type
@@ -209,8 +203,7 @@ interface
         a new ait type!                                                              }
       SkipInstr = [ait_comment, ait_symbol,ait_section
                    ,ait_stab, ait_function_name, ait_force_line
-                   ,ait_regalloc, ait_tempalloc, ait_symbol_end, ait_directive
-                   ,ait_file,ait_loc];
+                   ,ait_regalloc, ait_tempalloc, ait_symbol_end, ait_directive];
 
       { ait_* types which do not have line information (and hence which are of type
         tai, otherwise, they are of type tailineinfo }
@@ -220,7 +213,7 @@ interface
                      ait_cutobject,ait_marker,ait_align,ait_section,ait_comment,
                      ait_const,
                      ait_real_32bit,ait_real_64bit,ait_real_80bit,ait_comp_64bit,ait_real_128bit,
-                     ait_file,ait_loc,ait_symbol
+                     ait_symbol
                     ];
 
 
@@ -531,27 +524,6 @@ interface
           procedure ppuwrite(ppufile:tcompilerppufile);override;
        end;
 
-       { Generates a dwarf file location }
-       tai_file = class(tai)
-          str : pchar;
-          idx : longint;
-          constructor Create(_str : string);
-          destructor Destroy; override;
-          constructor ppuload(t:taitype;ppufile:tcompilerppufile);override;
-          procedure ppuwrite(ppufile:tcompilerppufile);override;
-          function getcopy:tlinkedlistitem;override;
-       end;
-
-       { Generates a dwarf line location }
-       tai_loc = class(tai)
-          fileentry : tai_file;
-          line,
-          column : longint;
-          constructor Create(_fileidx : tai_file;_line,_column : longint);
-          constructor ppuload(t:taitype;ppufile:tcompilerppufile);override;
-          procedure ppuwrite(ppufile:tcompilerppufile);override;
-       end;
-
        tadd_reg_instruction_proc=procedure(instr:Tai;r:tregister) of object;
 
         { Class template for assembler instructions
@@ -1883,94 +1855,6 @@ implementation
       end;
 
 
-{****************************************************************************
-                                    tai_file
- ****************************************************************************}
-
-    constructor tai_file.Create(_str : string);
-      begin
-        inherited Create;
-        typ:=ait_file;
-        getmem(str,length(_str)+1);
-        move(_str[1],str^,length(_str));
-        str[length(_str)]:=#0;
-      end;
-
-
-    destructor tai_file.destroy;
-      begin
-         freemem(str);
-         inherited Destroy;
-      end;
-
-
-    constructor tai_file.ppuload(t:taitype;ppufile:tcompilerppufile);
-      var
-        len : longint;
-      begin
-        inherited ppuload(t,ppufile);
-        len:=ppufile.getlongint;
-        getmem(str,len+1);
-        ppufile.getdata(str^,len);
-        str[len]:=#0;
-        idx:=ppufile.getlongint;
-      end;
-
-
-    procedure tai_file.ppuwrite(ppufile:tcompilerppufile);
-      var
-        len : longint;
-      begin
-        inherited ppuwrite(ppufile);
-        len:=strlen(str);
-        ppufile.putlongint(len);
-        ppufile.putdata(str^,len);
-        ppufile.putlongint(idx);
-      end;
-
-
-    function tai_file.getcopy : tlinkedlistitem;
-      var
-        p : tlinkedlistitem;
-      begin
-        p:=inherited getcopy;
-        getmem(tai_comment(p).str,strlen(str)+1);
-        move(str^,tai_comment(p).str^,strlen(str)+1);
-        getcopy:=p;
-      end;
-
-
-{****************************************************************************
-                                    tai_loc
- ****************************************************************************}
-
-    constructor tai_loc.Create(_fileidx : tai_file;_line,_column : longint);
-      begin
-        inherited Create;
-        typ:=ait_loc;
-        fileentry:=_fileidx;
-        line:=_line;
-        column:=_column;
-      end;
-
-
-    constructor tai_loc.ppuload(t:taitype;ppufile:tcompilerppufile);
-      begin
-        inherited ppuload(t,ppufile);
-        {!!!! fileidx:=ppufile.getlongint; }
-        line:=ppufile.getlongint;
-        column:=ppufile.getlongint;
-      end;
-
-
-    procedure tai_loc.ppuwrite(ppufile:tcompilerppufile);
-      begin
-        inherited ppuwrite(ppufile);
-        {!!!!! ppufile.putlongint(fileidx); }
-        ppufile.putlongint(line);
-        ppufile.putlongint(column);
-      end;
-
 {*****************************************************************************
                                TaiInstruction
 *****************************************************************************}

+ 0 - 17
compiler/aggas.pas

@@ -967,23 +967,6 @@ implementation
                  end;
              end;
 
-           ait_file :
-             begin
-               tai_file(hp).idx:=nextdwarffileidx;
-               inc(nextdwarffileidx);
-               AsmWrite(#9'.file '+tostr(tai_file(hp).idx)+' "');
-
-               AsmWritePChar(tai_file(hp).str);
-               AsmWrite('"');
-               AsmLn;
-             end;
-
-           ait_loc :
-             begin
-               AsmWrite(#9'.loc '+tostr(tai_loc(hp).fileentry.idx)+' '+tostr(tai_loc(hp).line)+' '+tostr(tai_loc(hp).column));
-               AsmLn;
-             end;
-
            ait_force_line,
            ait_function_name : ;
 

+ 93 - 36
compiler/dbgdwarf.pas

@@ -29,6 +29,9 @@
   The easiest way to debug dwarf debug info generation is the usage of
   readelf --debug-dump <executable>
   This works only with elf targets though.
+  
+  There is a similar utility called dwarfdump which is not elf-specific and
+  which has been ported to most systems.
 }
 unit dbgdwarf;
 
@@ -1011,40 +1014,35 @@ implementation
       end;
 
     procedure TDebugInfoDwarf.appenddef_ord(def:torddef);
+      var
+        sign: tdwarf_type;
       begin
         case def.ordtype of
           s8bit,
           s16bit,
-          s32bit :
-            begin
-              { we should generate a subrange type here }
-              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_signed,
-                  DW_AT_byte_size,DW_FORM_data1,def.size
-                  ])
-              else
-                append_entry(DW_TAG_base_type,false,[
-                  DW_AT_encoding,DW_FORM_data1,DW_ATE_signed,
-                  DW_AT_byte_size,DW_FORM_data1,def.size
-                  ]);
-              finish_entry;
-            end;
+          s32bit,
           u8bit,
           u16bit,
           u32bit :
             begin
+              { generate proper signed/unsigned info for types like 0..3 }
+              { these are s8bit, but should be identified as unsigned    }
+              { because otherwise they are interpreted wrongly when used }
+              { in a bitpacked record                                    }
+              if (def.low<0) then
+                sign:=DW_ATE_signed
+              else
+                sign:=DW_ATE_unsigned;
               { we should generate a subrange type here }
               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_encoding,DW_FORM_data1,sign,
                   DW_AT_byte_size,DW_FORM_data1,def.size
                   ])
               else
                 append_entry(DW_TAG_base_type,false,[
-                  DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned,
+                  DW_AT_encoding,DW_FORM_data1,sign,
                   DW_AT_byte_size,DW_FORM_data1,def.size
                   ]);
               finish_entry;
@@ -1842,15 +1840,57 @@ implementation
 
 
       procedure TDebugInfoDwarf.appendsym_fieldvar(sym: tfieldvarsym);
+        var
+          bitoffset,
+          fieldoffset,
+          fieldnatsize: aint;
         begin
           if sp_static in sym.symoptions then Exit;
 
-          append_entry(DW_TAG_member,false,[
-            DW_AT_name,DW_FORM_string,symname(sym)+#0,
-            DW_AT_data_member_location,DW_FORM_block1,1+lengthuleb128(sym.fieldoffset)
-            ]);
+          if (tabstractrecordsymtable(sym.owner).usefieldalignment<>bit_alignment) or
+             { only ordinals are bitpacked }
+             not is_ordinal(sym.vardef) then
+            begin
+              { other kinds of fields can however also appear in a bitpacked   }
+              { record, and then their offset is also specified in bits rather }
+              { than in bytes                                                  }
+              if (tabstractrecordsymtable(sym.owner).usefieldalignment<>bit_alignment) then
+                fieldoffset:=sym.fieldoffset
+              else
+                fieldoffset:=sym.fieldoffset div 8;
+              append_entry(DW_TAG_member,false,[
+                DW_AT_name,DW_FORM_string,symname(sym)+#0,
+                DW_AT_data_member_location,DW_FORM_block1,1+lengthuleb128(fieldoffset)
+                ]);
+            end
+          else
+            begin
+              if (sym.vardef.packedbitsize > 255) then
+                internalerror(2007061201);
+
+              { we don't bitpack according to the ABI, but as close as }
+              { possible, i.e., equivalent to gcc's                    }
+              { __attribute__((__packed__)), which is also what gpc    }
+              { does.                                                  }
+              fieldnatsize:=max(sizeof(aint),sym.vardef.size);
+              fieldoffset:=(sym.fieldoffset div (fieldnatsize*8)) * fieldnatsize;
+              bitoffset:=sym.fieldoffset mod (fieldnatsize*8);
+              if (target_info.endian=endian_little) then
+                bitoffset:=(fieldnatsize*8)-bitoffset-sym.vardef.packedbitsize;
+              append_entry(DW_TAG_member,false,[
+                DW_AT_name,DW_FORM_string,symname(sym)+#0,
+                { gcc also generates both a bit and byte size attribute }
+                { we don't support ordinals >= 256 bits }
+                DW_AT_byte_size,DW_FORM_data1,fieldnatsize,
+                { nor >= 256 bits (not yet, anyway, see IE above) }
+                DW_AT_bit_size,DW_FORM_data1,sym.vardef.packedbitsize,
+                { data1 and data2 are unsigned, bitoffset can also be negative }
+                DW_AT_bit_offset,DW_FORM_data4,bitoffset,
+                DW_AT_data_member_location,DW_FORM_block1,1+lengthuleb128(fieldoffset)
+                ]);
+            end;
           current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_8bit(ord(DW_OP_plus_uconst)));
-          current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_uleb128bit(sym.fieldoffset));
+          current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_uleb128bit(fieldoffset));
 
           append_labelentry_ref(DW_AT_type,def_dwarf_lab(sym.vardef));
           finish_entry;
@@ -2358,7 +2398,7 @@ implementation
         append_entry(DW_TAG_compile_unit,true,[
           DW_AT_name,DW_FORM_string,FixFileName(current_module.sourcefiles.get_file(1).name^)+#0,
           DW_AT_producer,DW_FORM_string,'Free Pascal '+full_version_string+' '+date_string+#0,
-          DW_AT_comp_dir,DW_FORM_string,BsToSlash(FixPath(current_module.sourcefiles.get_file(1).path^,false))+#0,
+          DW_AT_comp_dir,DW_FORM_string,BsToSlash(FixPath(GetCurrentDir,false))+#0,
           DW_AT_language,DW_FORM_data1,DW_LANG_Pascal83,
           DW_AT_identifier_case,DW_FORM_data1,DW_ID_case_insensitive]);
 
@@ -2742,20 +2782,37 @@ implementation
 
     procedure TDebugInfoDwarf2.appenddef_set(def: tsetdef);
       begin
-        { 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
-            ]);
+          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;
 

+ 5 - 2
compiler/dbgstabs.pas

@@ -159,7 +159,7 @@ implementation
         varvaluedata:array[0..maxdata+256] of char;
         varptr:Pchar;
         varidx : byte;
-        len:cardinal;
+        len:longint;
         r:Pchar;
 
     begin
@@ -374,7 +374,10 @@ implementation
             inc(state^.stabsize,strlen(newrec));
             freemem(newrec);
             {This should be used for case !!}
-            inc(state^.recoffset,Tfieldvarsym(p).vardef.size);
+            if int64(state^.recoffset)+Tfieldvarsym(p).vardef.size>high(longint) then
+              state^.recoffset:=high(longint)
+            else
+              inc(state^.recoffset,Tfieldvarsym(p).vardef.size);
           end;
       end;
 

+ 45 - 0
compiler/globals.pas

@@ -118,6 +118,7 @@ interface
          localswitches   : tlocalswitches;
          modeswitches    : tmodeswitches;
          optimizerswitches : toptimizerswitches;
+         debugswitches   : tdebugswitches;
          { 0: old behaviour for sets <=256 elements
            >0: round to this size }
          setalloc,
@@ -343,6 +344,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;
 
@@ -992,6 +994,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;
@@ -1193,6 +1237,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

@@ -137,6 +137,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)
        }
@@ -164,6 +174,9 @@ interface
          'PEEPHOLE','ASMCSE','LOOPUNROLL','TAILREC'
        );
 
+       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

@@ -2540,6 +2540,8 @@ S*2Aas_Assemble using GNU AS
 *g2gc_Generate checks for pointers
 *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 = 45027;
+  MsgTxtSize = 45136;
 
   MsgIdxMax : array[1..20] of longint=(
     24,86,237,83,63,49,107,22,135,60,

+ 66 - 62
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+
@@ -919,164 +919,168 @@ const msgtxt : array[0..000187,1..240] of char=(
   '*g2gc_Generate checks for pointe','rs'#010+
   '*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
   '*g2gl_Use line info unit (show more info with backtraces)'#010+
-  '*g2gp_Preserve case in stabs symbol names'#010+
+  '*g2go<x>_Set debug information options'#010+
+  '*g3godwarfsets_ Enable Dwarf set debug information (breaks gdb < 6.5)'#010+
+  '*g2gp_','Preserve case in stabs symbol names'#010+
   '*g2gs_Generate stabs debug information'#010+
-  '*g2gt_Trash local variables (to de','tect uninitialized uses)'#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+
-  '*g2gw2_Generate dwarf-2 debug information'#010+
+  '*','g2gw2_Generate dwarf-2 debug information'#010+
   '*g2gw3_Generate dwarf-3 debug information'#010+
   '**1i_Information'#010+
-  '**2iD_Ret','urn compiler date'#010+
+  '**2iD_Return compiler date'#010+
   '**2iV_Return short compiler version'#010+
   '**2iW_Return full compiler version'#010+
   '**2iSO_Return compiler OS'#010+
-  '**2iSP_Return compiler host processor'#010+
+  '**2iSP_Return co','mpiler host processor'#010+
   '**2iTO_Return target OS'#010+
   '**2iTP_Return target processor'#010+
-  '**1I<x>_Add <x> to include path'#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+
-  '**2Mobjfpc_FPC mode with Object Pascal support'#010+
+  '**2Mobjfpc_FP','C mode with Object Pascal support'#010+
   '**2Mdelphi_Delphi 7 compatibility mode'#010+
-  '**2Mtp_TP/BP 7.0 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<x>_Node tree optimizations'#010+
-  '**2Nu_Unroll loops'#010+
+  '*','*2Nu_Unroll loops'#010+
   '**1o<x>_Change the name of the executable produced to <x>'#010+
   '**1O<x>_Optimizations:'#010+
-  '**2O-_Disa','ble 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 optimizations (-O1 + quick optimizations)',#010+
   '**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+
   '**2Oa<x>=<y>_Set alignment'#010+
-  '**2Oo[NO]<x>_Enable or dis','able optimizations, see fpc -i for possibl'+
-  'e values'#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+
-  '**2Os_Optimize for size rather than speed'#010+
+  '**2Os_Opt','imize for size rather than speed'#010+
   '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+
-  '**1R<x>_Assemble','r reading style:'#010+
+  '**1R<x>_Assembler reading style:'#010+
   '**2Rdefault_Use default assembler for target'#010+
   '3*2Ratt_Read AT&T style assembler'#010+
-  '3*2Rintel_Read Intel style assembler'#010+
+  '3*2Rintel_Read Intel style assemble','r'#010+
   '6*2RMOT_Read motorola style assembler'#010+
   '**1S<x>_Syntax options:'#010+
   '**2S2_Same as -Mobjfpc'#010+
-  '**2Sc_Support operator','s like C (*=,+=,/= and -=)'#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+
+  '**2Se<x>_Error options. <x> is a combination of the foll','owing:'#010+
   '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+
-  '**3*_w : Compiler also halts after warni','ngs'#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+
+  '**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/f','unctions declared as "inline"'#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 (defaul','t)'#010+
   '**3SIcorba_CORBA compatible interface'#010+
   '**2Sm_Support macros like C (global)'#010+
   '**2So_Same as -Mtp'#010+
-  '**2Ss_Constr','uctor name must be init (destructor must be done)'#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+
+  '**2Sx_Enable exception keywords (default in',' Delphi/ObjFPC modes)'#010+
   '**1s_Do not call assembler and linker'#010+
   '**2sh_Generate script to link on host'#010+
-  '**2st_Gener','ate script to link on target'#010+
+  '**2st_Generate script to link on target'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**1T<x>_Target operating system:'#010+
-  '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
+  '3*2Temx_OS/2 via',' EMX (including EMX/RSX extender)'#010+
   '3*2Tfreebsd_FreeBSD'#010+
   '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
-  '3*2Tlin','ux_Linux'#010+
+  '3*2Tlinux_Linux'#010+
   '3*2Tnetbsd_NetBSD'#010+
   '3*2Tnetware_Novell Netware Module (clib)'#010+
   '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Topenbsd_OpenBSD'#010+
-  '3*2Tos2_OS/2 / eComStation'#010+
+  '3','*2Tos2_OS/2 / eComStation'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
   '3*2Twatcom_Watcom compatible DOS extender'#010+
-  '3*2Twdosx_WDOSX D','OS 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*2Tatari_Atari ST/STe/TT'#010+
-  '6*2Tlinux_Linux/m68k'#010+
+  '6*2Tl','inux_Linux/m68k'#010+
   '6*2Tmacos_Macintosh m68k (not supported)'#010+
   '6*2Tpalmos_PalmOS'#010+
   'A*2Tlinux_Linux'#010+
-  'A*2Twince_Windows ','CE'#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*2Tmacos_Mac OS (classic) on PowerPC'#010+
+  'P*2Tmacos_Mac OS (classic) on ','PowerPC'#010+
   'P*2Tmorphos_MorphOS'#010+
   'S*2Tlinux_Linux'#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+
+  '**2Un_Do not check where the unit name matches the file name'#010+
   '**2Ur_Generate release unit files (never automatically recompiled)'#010+
-  '**2Us_Compile a system unit'#010+
+  '**2Us_Compile a ','system unit'#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*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
   '**2*_w : Show warnings               u : Show unit info'#010+
-  '**2*_n : Show notes                  t : Show tried/used files'#010+
+  '**2*_n : Show notes                ','  t : Show tried/used files'#010+
   '**2*_h : Show hints                  c : Show conditionals'#010+
-  '**2*_i : Show general ','info           d : Show debug info'#010+
+  '**2*_i : Show general info           d : Show debug info'#010+
   '**2*_l : Show linenumbers            r : Rhide/GCC compatibility mode'#010+
-  '**2*_a : Show everything             x : Executable info (Win32 only)'#010+
+  '**2*_a : Show everything  ','           x : Executable info (Win32 only'+
+  ')'#010+
   '**2*_b : Write file names messages with full path'#010+
-  '**2*_v : Write ','fpcdebug.txt with     p : Write tree.log with parse t'+
-  'ree'#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 options (targets)'#010+
-  '3*2Wb_Create a bundle ins','tead of a library (Darwin)'#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+
-  '3*2WC_Specify ','console type application (EMX, OS/2, Windows)'#010+
+  '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
   'A*2WC_Specify console type application (Windows)'#010+
-  'P*2WC_Specify console type application (Classic Mac OS)'#010+
+  'P*2WC_Specify console type applicati','on (Classic Mac OS)'#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+
+  '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 (E','MX, OS/2, Windows)'#010+
   'A*2WG_Specify graphic type application (Windows)'#010+
-  'P*2WG_Specify graphic type application (C','lassic 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*2WR_Generate relocation code (Windows)'#010+
-  'P*2','WT_Specify MPW tool type application (Classic Mac OS)'#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+
+  '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Da','rwin, FreeBSD, L'+
+  'inux)'#010+
   '**2Xd_Do not use standard library search path (needed for cross compil'+
   'e)'#010+
-  '**2Xe_Use exte','rnal linker'#010+
+  '**2Xe_Use external linker'#010+
   '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC)'#010+
   '**2Xi_Use internal 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+
-  '**2XP<x>_Prepend the binutils names wi','th the prefix <x>'#010+
+  '*','*2XM<x>_Set the name of the '#039'main'#039' program routine (default'+
+  ' is '#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_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
-  '**2Xt_Link with static libraries (-static is ','passed to linker)'#010+
+  '**2XS_','Try to link units statically (default, defines FPC_LINK_STATIC'+
+  ')'#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+
-  '**1h_Shows this help without waiting'#000
+  '**1h_Shows this help ','without waiting'#000
 );

+ 6 - 4
compiler/options.pas

@@ -815,10 +815,6 @@ begin
                          else
                            include(init_settings.localswitches,cs_checkpointer);
                        end;
-                     'd' :
-                       begin
-                         paratargetdbg:=dbg_dwarf2;
-                       end;
                      'h' :
                        begin
                          if UnsetBool(More, j) then
@@ -833,6 +829,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

+ 0 - 2
compiler/psystem.pas

@@ -527,8 +527,6 @@ implementation
         aiclass[ait_regalloc]:=tai_regalloc;
         aiclass[ait_tempalloc]:=tai_tempalloc;
         aiclass[ait_marker]:=tai_marker;
-        aiclass[ait_file]:=tai_file;
-        aiclass[ait_loc]:=tai_loc;
       end;
 
 end.