123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /* fix_m68k.h: Routines for M68000 code fixup
- Copyright (C) 2003 Sebastian Reichelt
- Copyright (C) 2004 Kevin Kofler
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
- #ifndef BINCODE_FIX_M68K_H
- #define BINCODE_FIX_M68K_H
- #include "../generic.h"
- #include "../data.h"
- // The alignment needed for sections with M68k code or data.
- #define M68K_SECTION_ALIGNMENT 2
- // Apply generic code fixes and optimizations to a section.
- void M68kFixCode (SECTION *Section);
- // Fix and optionally optimize code executable on the M68k processor family,
- // for two sections which are to be merged.
- // Src may be NULL.
- // If DestSize is nonzero, it specifies a fixed size for the destination
- // section, which will not change even when cutting ranges from it.
- void M68kFixCodePreMerge (SECTION *Dest, SECTION *Src, SIZE DestSize);
- // If the section ends with exactly one NOP instruction, remove the NOP.
- void M68kRemoveTrailingNOP (SECTION *Section);
- // Fix and possibly optimize a given relocation entry.
- // TargetDistance is the estimated (signed) distance of the relocation target,
- // including the fixed offset. OptimizeInfo contains information about what to
- // optimize.
- // The reloc may be removed during the process.
- void M68kFixReloc (RELOC *Reloc, OFFSET TargetDistance, OPTIMIZE_INFO *OptimizeInfo);
- // Checks if a specific reloc might be optimizable. This is currently
- // limited to 4-bytes absolute relocs because that is the only case
- // this is needed for.
- BOOLEAN M68kIsRelocOptimizable (const RELOC *Reloc);
- // Fix and return the target offset of a reloc.
- // In particular, for 1-byte relative relocs, the target offset is increased
- // by 1, so the the reloc points to the symbol and not to the symbol minus 1.
- OFFSET M68kFixTargetOffset (OFFSET Offset, SIZE RelocSize, BOOLEAN RelocRelative);
- // Determines the amount of relationship between the two sections, for the
- // situation that Section2 might be put just behind Section1. A reference
- // that could potentially be short gets 2048 points; a reference that could
- // potentially be removed gets twice as much.
- // The effect is that a section with one potentially short reference can
- // be at most 2048 bytes long for being inserted immediately by reordering,
- // and so on.
- COUNT M68kGetSectionRelationship (const SECTION *Section1, const SECTION *Section2);
- // Compute an estimate of how important it is to put the section containing this
- // reloc next during local section reordering.
- // Here are the estimates used:
- // 0-byte branches save 6 bytes and 1 reloc and cannot be deferred -> 512 points
- // 2-byte branches save 4 bytes and 1 reloc and can rarely be deferred -> 256
- // PC-relative references save 2 bytes and 1 reloc. They can be deferred based
- // on how far the accumulated distance is. We compute between 0 and 32 points
- // based on the offset, with the formula: (offset^2>>25)+2.
- COUNT M68kComputeRelocGoodness(OFFSET Offset, RELOC *Reloc);
- #endif
|