target_offset_t SegmentAlignment( // SEGMENT: ALIGNMENT FOR SYMBOL SYMBOL sym ) // - symbol to align { target_offset_t align; TYPE type; TYPE align_type; if( CompFlags.dont_align_segs ) { return( TARGET_CHAR ); } #if _CPU == _AXP if( PackAmount != TARGET_CHAR ) { #else if( OptSize <= 50 || PackAmount != TARGET_CHAR ) { #endif type = sym->sym_type; align_type = AlignmentType( type ); align = segmentTypeSize( align_type ); if( align == TARGET_CHAR ) { // no alignment; let PackAlignment know the real size align = segmentTypeSize( type ); } align = PackAlignment( TARGET_MAX_PACKING, align ); } else { align = TARGET_CHAR; } return( align ); } target_offset_t SegmentAdjust( // SEGMENT: ADJUST OFFSET TO ALIGN fe_seg_id segid, // - segment identifier target_size_t offset, // - current offset target_offset_t align ) // - required aligment { target_size_t calc_offset; target_offset_t adjust; switch( segid ) { case SEG_INIT_BEG: case SEG_INIT_REF: case SEG_INIT_END: case SEG_FINI_BEG: case SEG_FINI_REF: case SEG_FINI_END: /* no padding in these segments */ return( 0 ); } calc_offset = offset; calc_offset += align - 1; calc_offset &= ~(((target_size_t) align ) - 1 ); adjust = calc_offset - offset; _CHECK_ADJUST( adjust, calc_offset, offset ); return( adjust ); }
static unsigned cg_defined_type( // GET DEFINED TYPE TYPE type, // - C++ type CGREFNO *refno ) // - addr( reference # for type ) { CGREFNO retn; // - returned type retn = *refno; if( retn == NULL_CGREFNO ) { retn = cg_new_type( CgMemorySize( type ), CgMemorySize( AlignmentType( type ) ) ); *refno = retn; } return( retn ); }