|
9 | 9 | //
|
10 | 10 |
|
11 | 11 | using System;
|
| 12 | +using System.Diagnostics; |
12 | 13 |
|
13 | 14 | using RVA = System.UInt32;
|
14 | 15 |
|
@@ -47,11 +48,31 @@ public void AddMap (TextSegment segment, int length)
|
47 | 48 | map [(int) segment] = new Range (GetStart (segment), (uint) length);
|
48 | 49 | }
|
49 | 50 |
|
50 |
| - public void AddMap (TextSegment segment, int length, int align) |
| 51 | + uint AlignUp (uint value, uint align) |
51 | 52 | {
|
52 | 53 | align--;
|
| 54 | + return (value + align) & ~align; |
| 55 | + } |
53 | 56 |
|
54 |
| - AddMap (segment, (length + align) & ~align); |
| 57 | + public void AddMap (TextSegment segment, int length, int align) |
| 58 | + { |
| 59 | + var index = (int) segment; |
| 60 | + uint start; |
| 61 | + if (index != 0) { |
| 62 | + // Align up the previous segment's length so that the new |
| 63 | + // segment's start will be aligned. |
| 64 | + index--; |
| 65 | + Range previous = map [index]; |
| 66 | + start = AlignUp (previous.Start + previous.Length, (uint) align); |
| 67 | + map [index].Length = start - previous.Start; |
| 68 | + } else { |
| 69 | + start = ImageWriter.text_rva; |
| 70 | + // Should already be aligned. |
| 71 | + Debug.Assert (start == AlignUp (start, (uint) align)); |
| 72 | + } |
| 73 | + Debug.Assert (start == GetStart (segment)); |
| 74 | + |
| 75 | + map [(int) segment] = new Range (start, (uint) length); |
55 | 76 | }
|
56 | 77 |
|
57 | 78 | public void AddMap (TextSegment segment, Range range)
|
|
0 commit comments