Quellcode durchsuchen

* handle absolute on strings correctly for dwarf debug info, resolves #39816

florian vor 3 Jahren
Ursprung
Commit
e28238da9b
2 geänderte Dateien mit 53 neuen und 14 gelöschten Zeilen
  1. 42 14
      compiler/dbgdwarf.pas
  2. 11 0
      tests/webtbs/tw39816.pp

+ 42 - 14
compiler/dbgdwarf.pas

@@ -2200,24 +2200,52 @@ implementation
               end;
             sl_vec:
               begin
-                if not assigned(currdef) or
-                   (currdef.typ<>arraydef) then
+                if not assigned(currdef) then
                   internalerror(2009031201);
                 { can't handle offsets with indirections yet }
                 if indirection then
                   exit;
-                if not is_packed_array(currdef) then
-                  elesize:=tarraydef(currdef).elesize
-                else
-                  begin
-                    elesize:=tarraydef(currdef).elepackedbitsize;
-                    { can't calculate the address of a non-byte aligned element }
-                    if (elesize mod 8)<>0 then
-                      exit;
-                    elesize:=elesize div 8;
-                  end;
-                inc(offset,(symlist^.value.svalue-tarraydef(currdef).lowrange)*elesize);
-                currdef:=tarraydef(currdef).elementdef;
+                case currdef.typ of
+                  arraydef:
+                    begin
+                      if not is_packed_array(currdef) then
+                        elesize:=tarraydef(currdef).elesize
+                      else
+                        begin
+                          elesize:=tarraydef(currdef).elepackedbitsize;
+                          { can't calculate the address of a non-byte aligned element }
+                          if (elesize mod 8)<>0 then
+                            exit;
+                          elesize:=elesize div 8;
+                        end;
+                      inc(offset,(symlist^.value.svalue-tarraydef(currdef).lowrange)*elesize);
+                      currdef:=tarraydef(currdef).elementdef;
+                    end;
+                  stringdef:
+                    begin
+                      case tstringdef(currdef).stringtype of
+                        st_widestring,st_unicodestring:
+                          begin
+                            inc(offset,(symlist^.value.svalue-1)*2);
+                            currdef:=cwidechartype;
+                          end;
+                        st_shortstring:
+                          begin
+                            inc(offset,symlist^.value.svalue);
+                            currdef:=cansichartype;
+                          end;
+                        st_ansistring:
+                          begin
+                            inc(offset,symlist^.value.svalue-1);
+                            currdef:=cansichartype;
+                          end;
+                        else
+                          Internalerror(2022070502);
+                      end;
+                    end;
+                  else
+                    internalerror(2022070501);
+                end;
               end;
             else
               internalerror(2009031403);

+ 11 - 0
tests/webtbs/tw39816.pp

@@ -0,0 +1,11 @@
+{ %OPT=-g }
+program Project1;
+
+{$mode objfpc}{$H+}
+Var
+  S:String[100];
+  C:Char absolute S[1];
+begin
+  s:='asdf';
+  writeln(s);
+end.