-static CodeRange* NewCodeRange (unsigned long Offs, unsigned long Size)
+static CodeRange* NewCodeRange (Segment* Seg, unsigned long Offs, unsigned long Size)
/* Create and return a new CodeRange struct */
{
/* Allocate memory */
CodeRange* R = xmalloc (sizeof (CodeRange));
/* Initialize the fields */
+ R->Seg = Seg;
R->Offs = Offs;
R->Size = Size;
-static void AddCodeRange (LineInfo* LI, unsigned long Offs, unsigned long Size)
+static void AddCodeRange (LineInfo* LI, Segment* Seg, unsigned long Offs,
+ unsigned long Size)
/* Add a range of code to this line */
{
unsigned I;
*/
for (I = 0; I < CollCount (CodeRanges); ++I) {
CodeRange* R = CollAtUnchecked (CodeRanges, I);
- if (Offs < R->Offs) {
-
- /* Got the insert position */
- if (Offs + Size == R->Offs) {
- /* Merge the two */
- R->Offs = Offs;
- R->Size += Size;
- } else {
- /* Insert a new entry */
- CollInsert (CodeRanges, NewCodeRange (Offs, Size), I);
- }
-
- /* Done */
- return;
-
- } else if (R->Offs + R->Size == Offs) {
-
- /* This is the regular case. Merge the two. */
- R->Size += Size;
-
- /* Done */
- return;
-
- }
+ /* Must be same segment */
+ if (R->Seg == Seg) {
+ if (Offs < R->Offs) {
+
+ /* Got the insert position */
+ if (Offs + Size == R->Offs) {
+ /* Merge the two */
+ R->Offs = Offs;
+ R->Size += Size;
+ } else {
+ /* Insert a new entry */
+ CollInsert (CodeRanges, NewCodeRange (Seg, Offs, Size), I);
+ }
+
+ /* Done */
+ return;
+
+ } else if (R->Offs + R->Size == Offs) {
+ /* This is the regular case. Merge the two. */
+ R->Size += Size;
+
+ /* Done */
+ return;
+ }
+ }
}
/* We must append an entry */
- CollAppend (CodeRanges, NewCodeRange (Offs, Size));
+ CollAppend (CodeRanges, NewCodeRange (Seg, Offs, Size));
}
/* Add the range for this fragment to all line infos */
for (I = 0; I < CollCount (&Frag->LineInfos); ++I) {
- AddCodeRange (CollAt (&Frag->LineInfos, I), Offs, Frag->Size);
+ AddCodeRange (CollAt (&Frag->LineInfos, I), S, Offs, Frag->Size);
}
/* Update the offset */