If a field in a record is at a variable offset from
the start of the record, then DebugInfo::getOrCreateType
crashes at this line
          MemberDesc->setOffset(int_bit_position(Member));
since the bit-offset is not an integer constant.  Fixed
by using 0 for the offset in this case - which is a cop
out, but doing anything else seems hard.  This is what
gcc does too.

Best wishes,

Duncan.
Index: gcc.llvm.master/gcc/llvm-debug.cpp
===================================================================
--- gcc.llvm.master.orig/gcc/llvm-debug.cpp	2007-04-11 20:00:04.000000000 +0200
+++ gcc.llvm.master/gcc/llvm-debug.cpp	2007-04-11 20:21:33.000000000 +0200
@@ -688,8 +688,13 @@
           MemberDesc->setFromType(MemberType);
           MemberDesc->setSize(NodeSizeInBits(Member));
           MemberDesc->setAlign(NodeAlignInBits(FieldNodeType));
-          MemberDesc->setOffset(int_bit_position(Member));
-          
+
+          tree bitOffset = bit_position (Member);
+          if (host_integerp (bitOffset, 0))
+            MemberDesc->setOffset(TREE_INT_CST_LOW(bitOffset));
+          else // field has variable position, use 0 for now.
+            MemberDesc->setOffset(0);
+
           if (TREE_PROTECTED(Member)) {
             MemberDesc->setIsProtected();
           } else if (TREE_PRIVATE(Member)) {
Index: llvm.master/test/FrontendAda/debug_var_size.ads
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ llvm.master/test/FrontendAda/debug_var_size.ads	2007-04-11 23:13:27.000000000 +0200
@@ -0,0 +1,8 @@
+-- RUN: %llvmgcc -c -g %s -o /dev/null
+package Debug_Var_Size is
+   subtype Length_Type is Positive range 1 .. 64;
+   type T (Length : Length_Type := 1) is record
+      Varying_Length : String (1 .. Length);
+      Fixed_Length   : Boolean;
+   end record;
+end;
_______________________________________________
llvm-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to