|  | 
| 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