aboutsummaryrefslogtreecommitdiff
path: root/gdb/xcoffread.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2013-08-26 15:28:28 +0000
committerUlrich Weigand <uweigand@de.ibm.com>2013-08-26 15:28:28 +0000
commita85c52f205d9f67ffa4c54197622d98f092db64e (patch)
treea60dcf04369a05321d821a918b23e09368c4e49d /gdb/xcoffread.c
parent188253007c7725379eae2dadbd47c3cea8c80bbc (diff)
downloadgdb-a85c52f205d9f67ffa4c54197622d98f092db64e.zip
gdb-a85c52f205d9f67ffa4c54197622d98f092db64e.tar.gz
gdb-a85c52f205d9f67ffa4c54197622d98f092db64e.tar.bz2
2013-08-26 Raunaq Bathija <raunaq12@in.ibm.com>
Ulrich Weigand <uweigand@de.ibm.com> * xcoffread.c (arrange_linetable): Add fix to correctly handle line tables generated by XLC compiled binaries.
Diffstat (limited to 'gdb/xcoffread.c')
-rw-r--r--gdb/xcoffread.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index afe1554..224cba9 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -437,6 +437,7 @@ arrange_linetable (struct linetable *oldLineTb)
struct linetable_entry *fentry; /* function entry vector */
int fentry_size; /* # of function entries */
struct linetable *newLineTb; /* new line table */
+ int extra_lines = 0;
#define NUM_OF_FUNCTIONS 20
@@ -458,6 +459,12 @@ arrange_linetable (struct linetable *oldLineTb)
fentry[function_count].line = ii;
fentry[function_count].pc = oldLineTb->item[ii].pc;
++function_count;
+
+ /* If the function was compiled with XLC, we may have to add an
+ extra line entry later. Reserve space for that. */
+ if (ii + 1 < oldLineTb->nitems
+ && oldLineTb->item[ii].pc != oldLineTb->item[ii + 1].pc)
+ extra_lines++;
}
}
@@ -474,7 +481,7 @@ arrange_linetable (struct linetable *oldLineTb)
newLineTb = (struct linetable *)
xmalloc
(sizeof (struct linetable) +
- (oldLineTb->nitems - function_count) * sizeof (struct linetable_entry));
+ (oldLineTb->nitems - function_count + extra_lines) * sizeof (struct linetable_entry));
/* If line table does not start with a function beginning, copy up until
a function begin. */
@@ -489,13 +496,26 @@ arrange_linetable (struct linetable *oldLineTb)
for (ii = 0; ii < function_count; ++ii)
{
+ /* If the function was compiled with XLC, we may have to add an
+ extra line to cover the function prologue. */
+ jj = fentry[ii].line;
+ if (jj + 1 < oldLineTb->nitems
+ && oldLineTb->item[jj].pc != oldLineTb->item[jj + 1].pc)
+ {
+ newLineTb->item[newline] = oldLineTb->item[jj];
+ newLineTb->item[newline].line = oldLineTb->item[jj + 1].line;
+ newline++;
+ }
+
for (jj = fentry[ii].line + 1;
jj < oldLineTb->nitems && oldLineTb->item[jj].line != 0;
++jj, ++newline)
newLineTb->item[newline] = oldLineTb->item[jj];
}
xfree (fentry);
- newLineTb->nitems = oldLineTb->nitems - function_count;
+ /* The number of items in the line table must include these
+ extra lines which were added in case of XLC compiled functions. */
+ newLineTb->nitems = oldLineTb->nitems - function_count + extra_lines;
return newLineTb;
}