ide/debugger: Debugger improvements (Corrected member offsets, Attempt to support...
authorJerome St-Louis <jerome@ecere.com>
Wed, 14 Sep 2011 17:51:40 +0000 (13:51 -0400)
committerJerome St-Louis <jerome@ecere.com>
Wed, 14 Sep 2011 18:05:30 +0000 (14:05 -0400)
compiler/libec/src/firstPass.ec
compiler/libec/src/loadSymbols.ec
compiler/libec/src/pass15.ec
ecere/src/com/instance.ec
ecere/src/gui/Window.ec
ide/src/debugger/Debugger.ec
ide/src/debugger/debugTools.ec
ide/src/designer/CodeEditor.ec

index 4f73662..9eb3b55 100644 (file)
@@ -563,7 +563,7 @@ public void PrePreProcessClassDefinitions()
          if(external.type == classExternal)
          {
             ClassDefinition _class = external._class;
-            if(_class.definitions && !_class.symbol.registered)
+            if(_class.definitions && (!_class.symbol.registered || !inCompiler))
             {
                ProcessClass(normalClass, _class.definitions, _class.symbol, _class.baseSpecs, null, _class.loc, ast, external.prev, null, _class.declMode);
                _class.symbol.isStatic = _class.declMode == staticAccess;
index 78ae750..f53e9ed 100644 (file)
@@ -824,8 +824,13 @@ public void ImportModule(char * name, ImportType importType, AccessMode importAc
             {
                for(dir : sourceDirs)
                {
+                  char configDir[MAX_FILENAME];
                   strcpy(symFile, dir);
-                  PathCat(symFile, "Debug");
+                  // PathCat(symFile, "Debug");
+                  PathCat(symFile, "obj");
+                  sprintf(configDir, "debug.%s", (GetRuntimePlatform() == win32) ? "win32" : "linux");
+                  PathCat(symFile, configDir);
+
                   PathCat(symFile, name);
                   ChangeExtension(symFile, "sym", symFile);
                   if(FileExists(symFile))
index eecffcc..488d300 100644 (file)
@@ -461,6 +461,7 @@ void ComputeClassMembers(Class _class, bool isMember)
    {
       int c;
       int unionMemberOffset = 0;
+      int bitFields = 0;
 
       if(!member && _class.destructionWatchOffset)
          _class.memberOffset += sizeof(OldList);
@@ -516,7 +517,7 @@ void ComputeClassMembers(Class _class, bool isMember)
                else if(dataMember.type == normalMember && dataMember.dataType)
                {
                   int size;
-                  int alignment;
+                  int alignment = 0;
 
                   // Prevent infinite recursion
                   if(dataMember.dataType.kind != classType || 
@@ -524,8 +525,55 @@ void ComputeClassMembers(Class _class, bool isMember)
                      _class.type != structClass)))
                      ComputeTypeSize(dataMember.dataType);
 
-                  size = dataMember.dataType.size;
-                  alignment = dataMember.dataType.alignment;
+                  if(dataMember.dataType.bitFieldCount)
+                  {
+                     bitFields += dataMember.dataType.bitFieldCount;
+                     size = 0;
+                  }
+                  else
+                  {
+                     if(bitFields)
+                     {
+                        int size = (bitFields + 7) / 8;
+
+                        if(isMember)
+                        {
+                           // TESTING THIS PADDING CODE
+                           if(alignment)
+                           {
+                              member.structAlignment = Max(member.structAlignment, alignment);
+
+                              if(member.memberOffset % alignment)
+                                 member.memberOffset += alignment - (member.memberOffset % alignment);
+                           }
+
+                           dataMember.offset = member.memberOffset;
+                           if(member.type == unionMember)
+                              unionMemberOffset = Max(unionMemberOffset, dataMember.dataType.size);
+                           else
+                           {
+                              member.memberOffset += size;
+                           }
+                        }
+                        else
+                        {
+                           // TESTING THIS PADDING CODE
+                           if(alignment)
+                           {
+                              _class.structAlignment = Max(_class.structAlignment, alignment);
+
+                              if(_class.memberOffset % alignment)
+                                 _class.memberOffset += alignment - (_class.memberOffset % alignment);
+                           }
+
+                           dataMember.offset = _class.memberOffset;
+                           _class.memberOffset += size;
+                        }
+                        bitFields = 0;
+                     }
+                     size = dataMember.dataType.size;
+                     alignment = dataMember.dataType.alignment;
+                  }
 
 #ifdef _DEBUG
                   if(!size)
@@ -590,6 +638,43 @@ void ComputeClassMembers(Class _class, bool isMember)
                }
             }
          }
+         if(bitFields)
+         {
+            int alignment = 0;
+            int size = (bitFields + 7) / 8;
+
+            if(isMember)
+            {
+               // TESTING THIS PADDING CODE
+               if(alignment)
+               {
+                  member.structAlignment = Max(member.structAlignment, alignment);
+
+                  if(member.memberOffset % alignment)
+                     member.memberOffset += alignment - (member.memberOffset % alignment);
+               }
+
+               if(member.type == unionMember)
+                  unionMemberOffset = Max(unionMemberOffset, dataMember.dataType.size);
+               else
+               {
+                  member.memberOffset += size;
+               }
+            }
+            else
+            {
+               // TESTING THIS PADDING CODE
+               if(alignment)
+               {
+                  _class.structAlignment = Max(_class.structAlignment, alignment);
+
+                  if(_class.memberOffset % alignment)
+                     _class.memberOffset += alignment - (_class.memberOffset % alignment);
+               }
+               _class.memberOffset += size;
+            }
+            bitFields = 0;
+         }
       }
       if(member && member.type == unionMember)
       {
@@ -3670,8 +3755,11 @@ bool MatchTypeExpression(Expression sourceExp, Type dest, OldList conversions, b
                sourceExp.expType = null;
                ProcessExpressionType(sourceExp);
 
+               FreeType(sourceExp.expType);
+               sourceExp.expType = dest;
+
                FreeType(source);
-               FreeType(dest);
+               // FreeType(dest);
 
                return true;
             }
index 9f47d32..c3ffee3 100644 (file)
@@ -1870,6 +1870,7 @@ static void FixDerivativesBase(Class base, Class mod)
       Class enumBase = null;
       char * dataTypeString = null;
       Class baseClass;
+      uint offsetBefore = _class.offset;
 
       int offsetClass, totalSizeClass;
 
@@ -2022,10 +2023,18 @@ static void FixDerivativesBase(Class base, Class mod)
                }
             }
          }
-         if(mod.base.memberID)
+         // if(mod.base.memberID)
          {
             for(member = _class.membersAndProperties.first; member; member = member.next)
+            {
+               int offsetDiff = _class.offset - offsetBefore;
+               if(!member.isProperty && offsetDiff > 0)
+               {
+                  member.offset += offsetDiff;
+                  member.memberOffset += offsetDiff;
+               }
                member.id += mod.base.memberID;
+            }
 
             _class.memberID += mod.base.memberID;
             _class.startMemberID += mod.base.memberID;
index 641eaf6..c66ec86 100644 (file)
@@ -219,7 +219,8 @@ public /*private */struct Extent : OldList //FastList
 
       // Clear();
       Empty();
-      FASTLIST_LOOP(source, extentBox)
+      //FASTLIST_LOOP(source, extentBox)
+      for(extentBox = (BoxItem)source.first; extentBox; extentBox = (BoxItem)extentBox.next)
          AddBox(extentBox.box);
    }
 
@@ -228,8 +229,10 @@ public /*private */struct Extent : OldList //FastList
       // Clip all boxes of extent against inside of the new box
       BoxItem extentBox, next;
 
-      FASTLIST_LOOPN(this, extentBox, next)
+      //FASTLIST_LOOPN(this, extentBox, next)   // Macros still mess up the parser!
+      for(extentBox = (BoxItem)this.first; extentBox; extentBox = next)
       {
+         next = (BoxItem)extentBox.next;
          if(box.left > extentBox.box.left) extentBox.box.left = box.left;
          if(box.top > extentBox.box.top) extentBox.box.top = box.top;
          if(box.right < extentBox.box.right) extentBox.box.right = box.right;
@@ -246,7 +249,7 @@ public /*private */struct Extent : OldList //FastList
       temp.Copy(this);
       Empty();
       
-      FASTLIST_LOOP(temp, extentBox)
+      for(extentBox = (BoxItem)temp.first; extentBox; extentBox = (BoxItem)extentBox.next)
       {
          if(extentBox.box.left < box.right && extentBox.box.right > box.left && 
             extentBox.box.top < box.bottom && extentBox.box.bottom > box.top)
@@ -312,7 +315,7 @@ public /*private */struct Extent : OldList //FastList
       BoxItem extentBox, next;
 
       // First pass: check if this box is not already covered by one of the extent's box
-      FASTLIST_LOOP(this, extentBox)
+      for(extentBox = (BoxItem)this.first; extentBox; extentBox = (BoxItem)extentBox.next)
       {
          if(extentBox.box.left <= box.left && extentBox.box.right >= box.right && 
             extentBox.box.top <= box.top && extentBox.box.bottom >= box.bottom)
@@ -323,8 +326,9 @@ public /*private */struct Extent : OldList //FastList
       }
         
       // Second pass: only keep boxes not completely covered in the new box
-      FASTLIST_LOOPN(this, extentBox, next)
+      for(extentBox = (BoxItem)this.first; extentBox; extentBox = next)
       {
+         next = (BoxItem)extentBox.next;
          if(extentBox.box.left >= box.left && extentBox.box.right <= box.right &&
             extentBox.box.top >= box.top && extentBox.box.bottom <= box.bottom)
             Delete(extentBox);
@@ -337,7 +341,7 @@ public /*private */struct Extent : OldList //FastList
       if(box.bottom >= box.top && box.right >= box.left)
       {
          // Optimization: if the resulting boxes touch, add them smarter
-         FASTLIST_LOOP(this, extentBox)
+         for(extentBox = (BoxItem)this.first; extentBox; extentBox = (BoxItem)extentBox.next)
          {
             if(box.top == extentBox.box.top && box.bottom == extentBox.box.bottom)
             {
@@ -377,7 +381,7 @@ public /*private */struct Extent : OldList //FastList
    {
       BoxItem extentBox;
 
-      FASTLIST_LOOP(b, extentBox)
+      for(extentBox = (BoxItem)b.first; extentBox; extentBox = (BoxItem)extentBox.next)
          UnionBox(extentBox.box, temp);
    }
 
@@ -388,7 +392,7 @@ public /*private */struct Extent : OldList //FastList
 
       Empty();
 
-      FASTLIST_LOOP(b, extentBox)
+      for(extentBox = (BoxItem)b.first; extentBox; extentBox = (BoxItem)extentBox.next)
       {
          temp2.Copy(temp);
          temp2.IntersectBox(extentBox.box);
@@ -401,14 +405,14 @@ public /*private */struct Extent : OldList //FastList
    void Exclusion(Extent b, Extent temp)
    {
       BoxItem extentBox;   
-      FASTLIST_LOOP(b, extentBox)
+      for(extentBox = (BoxItem)b.first; extentBox; extentBox = (BoxItem)extentBox.next)
          ExcludeBox(extentBox.box, temp);
    }
 
    void Offset(int x, int y)
    {
       BoxItem extentBox;
-      FASTLIST_LOOP(this, extentBox)
+      for(extentBox = (BoxItem)this.first; extentBox; extentBox = (BoxItem)extentBox.next)
       {
          extentBox.box.left += x;
          extentBox.box.top += y;
@@ -2809,7 +2813,7 @@ private:
                dirty->Empty();
 
                // Will need scrolledArea.x & scrolledArea.y to support multiple scrolls
-               FASTLIST_LOOP(scrollExtent, scrollBox)
+               for(scrollBox = (BoxItem)scrollExtent.first; scrollBox; scrollBox = (BoxItem)scrollBox.next)
                   display.Scroll(scrollBox.box, scrolledArea.x, scrolledArea.y, dirty);
 
                scrolledArea.x = 0;
@@ -2896,7 +2900,7 @@ private:
             printf("\n\nRendering %s (%x):\n------------------------------------------\n", _class.name, this);*/
 #endif
             
-         FASTLIST_LOOP(renderArea, extentBox)
+         for(extentBox = (BoxItem)renderArea.first; extentBox; extentBox = (BoxItem)extentBox.next)
          {
             Box box = extentBox.box;
 
@@ -2928,7 +2932,8 @@ private:
       {
          // TO DO: There's an issue about draw over children...
          // TO DO: Don't wanna go through this if method isn't used
-         FASTLIST_LOOP(/*renderArea */overRenderArea, extentBox)
+         for(extentBox = (BoxItem)overRenderArea.first; extentBox; extentBox = (BoxItem)extentBox.next)
+         //FASTLIST_LOOP(/*renderArea */overRenderArea, extentBox)
          {
             Box box = extentBox.box;
 
@@ -2999,7 +3004,8 @@ private:
             //printf("\n\nUpdate:\n------------------------------------------\n");
 #endif
             
-            FASTLIST_LOOP(updateExtent, extentBox)
+            //FASTLIST_LOOP(updateExtent, extentBox)
+            for(extentBox = (BoxItem)updateExtent.first; extentBox; extentBox = (BoxItem)extentBox.next)
             {
 #ifdef _DEBUG
                /*printf("Updating (%d, %d) - (%d, %d)\n", 
@@ -3073,8 +3079,9 @@ private:
             {
                BoxItem extentBox, next;
                BoxItem first = (BoxItem)ACCESS_ITEM(dirtyBack, dirtyBack.first);
-               FASTLIST_LOOPN(dirtyBack, extentBox, next)
+               for(extentBox = (BoxItem)dirtyBack.first; extentBox; extentBox = next)
                {
+                  next = (BoxItem)extentBox.next;
                   if(extentBox != first)
                   {
                      if(extentBox.box.left < first.box.left)
index f6009c1..c49b738 100644 (file)
@@ -2283,7 +2283,8 @@ class Debugger
                      }
                      break;
                   case memoryErrorExp:
-                     sprintf(watchmsg, "Memory can't be read at %s", (exp.type == constantExp) ? exp.constant : null);
+                     // Need to ensure when set to memoryErrorExp, constant is set
+                     sprintf(watchmsg, "Memory can't be read at %s", /*(exp.type == constantExp) ? */exp.constant /*: null*/);
                      break;
                   case dereferenceErrorExp:
                      sprintf(watchmsg, "Dereference failure for \"%s\"", wh.expression);
@@ -2474,8 +2475,11 @@ class Debugger
                      else
                      {
                         char tempString[256];
-                        sprintf(watchmsg, "Evaluation failed for \"%s\" of type \"%s\"", wh.expression, 
-                              exp.type.OnGetString(tempString, null, null));
+                        if(exp.member.memberType == propertyMember)
+                           sprintf(watchmsg, "Missing property evaluation support for \"%s\"", wh.expression);
+                        else
+                           sprintf(watchmsg, "Evaluation failed for \"%s\" of type \"%s\"", wh.expression, 
+                                 exp.type.OnGetString(tempString, null, null));
                      }
                      break;
                }
@@ -2522,6 +2526,10 @@ class Debugger
    {
       eval.active = true;
       eval.error = none;
+#ifdef _DEBUG
+      if(!size)
+         printf("GdbReadMemoryString called with size = 0!\n");
+#endif
       GdbCommand(false, "-data-read-memory 0x%08x %c, %d, %d, %d", address, format, size, rows, cols);
       if(eval.active)
          ide.outputView.debugBox.Logf("Debugger Error: GdbReadMemoryString\n");
@@ -2533,6 +2541,10 @@ class Debugger
       eval.active = true;
       eval.error = none;
       GdbCommand(false, "-data-read-memory 0x%08x %c, 1, 1, %d", address, 'u', bytes);
+#ifdef _DEBUG
+      if(!bytes)
+         printf("GdbReadMemory called with bytes = 0!\n");
+#endif
       if(eval.active)
          ide.outputView.debugBox.Logf("Debugger Error: GdbReadMemory\n");
       else if(eval.result && strcmp(eval.result, "N/A"))
index 3210db6..d9d143e 100644 (file)
@@ -188,7 +188,10 @@ void DebugComputeExpression(Expression exp)
                   */}
                }
                else
+               {
                   exp.type = evalError;
+                  exp.constant = PrintHexUInt(address);
+               }
                break;
             case shortType:
             case intType:
@@ -211,7 +214,10 @@ void DebugComputeExpression(Expression exp)
                   }
                }
                else
+               {
+                  exp.constant = CopyString("");
                   exp.type = evalError;
+               }
                break;
             case classType:
                if(isPointer)
@@ -252,11 +258,17 @@ void DebugComputeExpression(Expression exp)
                if(evaluation)
                   ;
                else
+               {
+                  exp.constant = CopyString("");
                   exp.type = evalError;
+               }
                break;
          }
          if(evalError != dummyExp)
+         {
             exp.type = evalError;
+            exp.constant = CopyString("");
+         }
          else
          {
             if(evaluation)
@@ -328,7 +340,10 @@ void DebugComputeExpression(Expression exp)
                   sprintf(temp, "%c%s", exp.op.op, exp.op.exp2.identifier.string);
                   evaluation = Debugger::EvaluateExpression(temp, &evalError);
                   if(evalError != dummyExp)
+                  {
                      exp.type = evalError;
+                     exp.constant = CopyString("");
+                  }
                   else if(evaluation)
                   {
                      expNew = ParseExpressionString(evaluation);
@@ -452,6 +467,7 @@ void DebugComputeExpression(Expression exp)
                         if(evalError != dummyExp)
                         {
                            exp1.type = evalError;
+                           exp.constant = CopyString("");
                            expError = exp1;
                         }
                         else
@@ -615,7 +631,10 @@ void DebugComputeExpression(Expression exp)
                   address += offset * size;
                   evaluation = Debugger::ReadMemory(address, size, format, &evalError);
                   if(evalError != dummyExp)
+                  {
                      exp.type = evalError;
+                     exp.constant = CopyString("");
+                  }
                   else if(evaluation)
                   {
                      expNew = ParseExpressionString(evaluation);
@@ -991,7 +1010,7 @@ void DebugComputeExpression(Expression exp)
                         uint address;
                         Expression prev = exp.prev, next = exp.next;
                         char format; 
-                        int size = ComputeTypeSize(member.dataType);
+                        int size;
                         Expression expNew;
                         TypeKind kind = dummyType;
                         Type dataType = member.dataType;
@@ -1003,6 +1022,8 @@ void DebugComputeExpression(Expression exp)
                               (dataType._class.registered.type == enumClass || dataType._class.registered.type == bitClass || dataType._class.registered.type == unitClass))
                            dataType = dataType._class.registered.dataType;
 
+                        size = ComputeTypeSize(member.dataType);
+
                         format = GetGdbFormatChar(dataType);
                         //if(memberExp.address)
                         {
index 93ba8b9..2d8b8be 100644 (file)
@@ -3153,7 +3153,13 @@ class CodeEditor : Window
                                        
                                                                         if(propertyClass.type == structClass || propertyClass.type == normalClass || propertyClass.type == noHeadClass)
                                                                         {
-                                                                           Expression computed = CopyExpression(member.initializer.exp);
+                                                                           Expression computed;
+#ifdef _DEBUG
+                                                                           /*char debugExpString[4096];
+                                                                           debugExpString[0] = '\0';
+                                                                           PrintExpression(member.initializer.exp, debugExpString);*/
+#endif
+                                                                           computed = CopyExpression(member.initializer.exp);
                                                                            if(computed)
                                                                            {
                                                                               ComputeExpression(computed);