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