void SegAlign (unsigned Power, int Val) /* Align the PC segment to 2^Power. If Val is -1, emit fill fragments (the * actual fill value will be determined by the linker), otherwise use the * given value. */ { unsigned char Data [4]; unsigned long Align = (1UL << Power) - 1; unsigned long NewPC = (ActiveSeg->PC + Align) & ~Align; unsigned long Count = NewPC - ActiveSeg->PC; if (Val != -1) { /* User defined fill value */ memset (Data, Val, sizeof (Data)); while (Count) { if (Count > sizeof (Data)) { EmitData (Data, sizeof (Data)); Count -= sizeof (Data); } else { EmitData (Data, Count); Count = 0; } } } else { /* Linker defined fill value */ EmitFill (Count); } /* Remember the alignment in the header */ if (ActiveSeg->Align < Power) { ActiveSeg->Align = Power; } }
void SegAlign (unsigned long Alignment, int FillVal) /* Align the PC segment to Alignment. If FillVal is -1, emit fill fragments * (the actual fill value will be determined by the linker), otherwise use * the given value. */ { unsigned char Data [4]; unsigned long CombinedAlignment; unsigned long Count; /* The segment must have the combined alignment of all separate alignments * in the source. Calculate this alignment and check it for sanity. */ CombinedAlignment = LeastCommonMultiple (ActiveSeg->Align, Alignment); if (CombinedAlignment > MAX_ALIGNMENT) { Error ("Combined alignment for active segment is %lu which exceeds %lu", CombinedAlignment, MAX_ALIGNMENT); /* Avoid creating large fills for an object file that is thrown away * later. */ Count = 1; } else { ActiveSeg->Align = CombinedAlignment; /* Output a warning for larger alignments if not suppressed */ if (CombinedAlignment > LARGE_ALIGNMENT && !LargeAlignment) { Warning (0, "Combined alignment is suspiciously large (%lu)", CombinedAlignment); } /* Calculate the number of fill bytes */ Count = AlignCount (ActiveSeg->PC, Alignment); } /* Emit the data or a fill fragment */ if (FillVal != -1) { /* User defined fill value */ memset (Data, FillVal, sizeof (Data)); while (Count) { if (Count > sizeof (Data)) { EmitData (Data, sizeof (Data)); Count -= sizeof (Data); } else { EmitData (Data, Count); Count = 0; } } } else { /* Linker defined fill value */ EmitFill (Count); } }
void EmitStrBuf (const StrBuf* Data) /* Emit a string into the current segment */ { /* Use EmitData to output the data */ EmitData (SB_GetConstBuf (Data), SB_GetLen (Data)); }