Browse Source

+ basic types and pointer types completed

git-svn-id: trunk@2357 -
florian 19 years ago
parent
commit
3755909958
1 changed files with 112 additions and 19 deletions
  1. 112 19
      compiler/dbgdwarf.pas

+ 112 - 19
compiler/dbgdwarf.pas

@@ -482,10 +482,7 @@ implementation
                   vtAnsistring:
                   vtAnsistring:
                     asmlist[al_dwarf_info].concat(tai_string.create(Ansistring(data[i].VAnsiString^)));
                     asmlist[al_dwarf_info].concat(tai_string.create(Ansistring(data[i].VAnsiString^)));
                   else
                   else
-                    begin
-                      writeln(data[i].VType);
-                      internalerror(200601264);
-                    end;
+                    internalerror(200601264);
                 end;
                 end;
 
 
 
 
@@ -500,6 +497,30 @@ implementation
               DW_FORM_data8:
               DW_FORM_data8:
                 asmlist[al_dwarf_info].concat(tai_const.create_64bit(data[i].VInteger));
                 asmlist[al_dwarf_info].concat(tai_const.create_64bit(data[i].VInteger));
 
 
+              DW_FORM_sdata:
+                case data[i].VType of
+                  vtInteger:
+                    asmlist[al_dwarf_info].concat(tai_const.create_sleb128bit(data[i].VInteger));
+                  vtInt64:
+                    asmlist[al_dwarf_info].concat(tai_const.create_sleb128bit(data[i].VInt64^));
+                  vtQWord:
+                    asmlist[al_dwarf_info].concat(tai_const.create_sleb128bit(data[i].VQWord^));
+                  else
+                    internalerror(200601285);
+                end;
+                
+              DW_FORM_udata:
+                case data[i].VType of
+                  vtInteger:
+                    asmlist[al_dwarf_info].concat(tai_const.create_uleb128bit(data[i].VInteger));
+                  vtInt64:
+                    asmlist[al_dwarf_info].concat(tai_const.create_uleb128bit(data[i].VInt64^));
+                  vtQWord:
+                    asmlist[al_dwarf_info].concat(tai_const.create_uleb128bit(data[i].VQWord^));
+                  else
+                    internalerror(200601284);
+                end;
+                
               { block gets only the size, the rest is appended manually by the caller }
               { block gets only the size, the rest is appended manually by the caller }
               DW_FORM_block1:
               DW_FORM_block1:
                 asmlist[al_dwarf_info].concat(tai_const.create_8bit(data[i].VInteger));
                 asmlist[al_dwarf_info].concat(tai_const.create_8bit(data[i].VInteger));
@@ -561,13 +582,40 @@ implementation
       procedure append_dwarftag_orddef(list:taasmoutput;def:torddef);
       procedure append_dwarftag_orddef(list:taasmoutput;def:torddef);
         begin
         begin
           case def.typ of
           case def.typ of
+            s8bit,
+            s16bit,
             s32bit :
             s32bit :
               begin
               begin
-                append_entry(DW_TAG_base_type,false,[
-                  DW_AT_name,DW_FORM_string,'Longint'#0,
-                  DW_AT_encoding,DW_FORM_data1,DW_ATE_signed,
-                  DW_AT_byte_size,DW_FORM_data1,4
-                  ]);
+                { 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,def.typesym.name+#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;
+            u8bit,
+            u16bit,
+            u32bit :
+              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,def.typesym.name+#0,
+                    DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned,
+                    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_byte_size,DW_FORM_data1,def.size
+                    ]);
                 finish_entry;
                 finish_entry;
               end;
               end;
             uvoid :
             uvoid :
@@ -586,20 +634,61 @@ implementation
                 finish_entry;
                 finish_entry;
               end;
               end;
             uwidechar :
             uwidechar :
-              ;
+              begin
+                append_entry(DW_TAG_base_type,false,[
+                  DW_AT_name,DW_FORM_string,'WideChar'#0,
+                  DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned_char,
+                  DW_AT_byte_size,DW_FORM_data1,2
+                  ]);
+                finish_entry;
+              end;
             bool8bit :
             bool8bit :
-              ;
+              begin
+                append_entry(DW_TAG_base_type,false,[
+                  DW_AT_name,DW_FORM_string,'Boolean'#0,
+                  DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned_char,
+                  DW_AT_byte_size,DW_FORM_data1,1
+                  ]);
+                finish_entry;
+              end;
             bool16bit :
             bool16bit :
-              ;
+              begin
+                append_entry(DW_TAG_base_type,false,[
+                  DW_AT_name,DW_FORM_string,'WordBool'#0,
+                  DW_AT_encoding,DW_FORM_data1,DW_ATE_boolean,
+                  DW_AT_byte_size,DW_FORM_data1,2
+                  ]);
+                finish_entry;
+              end;
             bool32bit :
             bool32bit :
-              ;
+              begin
+                append_entry(DW_TAG_base_type,false,[
+                  DW_AT_name,DW_FORM_string,'LongBool'#0,
+                  DW_AT_encoding,DW_FORM_data1,DW_ATE_boolean,
+                  DW_AT_byte_size,DW_FORM_data1,4
+                  ]);
+                finish_entry;
+              end;
             u64bit :
             u64bit :
-              ;
+              begin
+                append_entry(DW_TAG_base_type,false,[
+                  DW_AT_name,DW_FORM_string,'QWord'#0,
+                  DW_AT_encoding,DW_FORM_data1,DW_ATE_unsigned,
+                  DW_AT_byte_size,DW_FORM_data1,8
+                  ]);
+                finish_entry;
+              end;
             s64bit :
             s64bit :
-              ;
-            {u32bit : result:=def_stab_number(s32inttype.def)+';0;-1;'); }
+              begin
+                append_entry(DW_TAG_base_type,false,[
+                  DW_AT_name,DW_FORM_string,'Int64'#0,
+                  DW_AT_encoding,DW_FORM_data1,DW_ATE_signed,
+                  DW_AT_byte_size,DW_FORM_data1,8
+                  ]);
+                finish_entry;
+              end;
             else
             else
-              ;
+              internalerror(200601287);
           end;
           end;
         end;
         end;
 
 
@@ -614,6 +703,12 @@ implementation
         }
         }
           orddef :
           orddef :
             append_dwarftag_orddef(list,torddef(def));
             append_dwarftag_orddef(list,torddef(def));
+
+          pointerdef :
+            begin
+              append_entry(DW_TAG_pointer_type,false,[]);
+              append_labelentry_ref(DW_AT_type,def_dwarf_lab(tpointerdef(def).pointertype.def));
+            end;
         {
         {
           floatdef :
           floatdef :
             result:=floatdef_stabstr(tfloatdef(def));
             result:=floatdef_stabstr(tfloatdef(def));
@@ -623,8 +718,6 @@ implementation
             result:=recorddef_stabstr(trecorddef(def));
             result:=recorddef_stabstr(trecorddef(def));
           variantdef :
           variantdef :
             result:=def_stabstr_evaluate(def,'formal${numberstring};',[]);
             result:=def_stabstr_evaluate(def,'formal${numberstring};',[]);
-          pointerdef :
-            result:=strpnew('*'+def_stab_number(tpointerdef(def).pointertype.def));
           classrefdef :
           classrefdef :
             result:=strpnew(def_stab_number(pvmttype.def));
             result:=strpnew(def_stab_number(pvmttype.def));
           setdef :
           setdef :