/*****************************************************************************/
/* */
-/* segments.h */
+/* segments.h */
/* */
-/* Segment handling for the ld65 linker */
+/* Segment handling for the ld65 linker */
/* */
/* */
/* */
-/* (C) 1998-2011, Ullrich von Bassewitz */
+/* (C) 1998-2012, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
#include <stdio.h>
/* common */
+#include "coll.h"
#include "exprdefs.h"
/*****************************************************************************/
-/* Data */
+/* Data */
/*****************************************************************************/
+/* Forwards */
+struct MemoryArea;
+
/* Segment structure */
typedef struct Segment Segment;
struct Segment {
unsigned Name; /* Name index of the segment */
unsigned Id; /* Segment id for debug info */
- Segment* Next; /* Hash list */
- Segment* List; /* List of all segments */
- struct Section* SecRoot; /* Section list */
- struct Section* SecLast; /* Pointer to last section */
- unsigned long PC; /* PC were this segment is located */
- unsigned long Size; /* Size of data so far */
- struct ObjData* AlignObj; /* Module that requested the alignment */
+ Segment* Next; /* Hash list */
+ unsigned Flags; /* Segment flags */
+ Collection Sections; /* Sections in this segment */
+ struct MemoryArea* MemArea; /* Run memory area once placed */
+ unsigned long PC; /* PC were this segment is located */
+ unsigned long Size; /* Size of data so far */
const char* OutputName; /* Name of output file or NULL */
unsigned long OutputOffs; /* Offset in output file */
- unsigned char Align; /* Alignment needed */
- unsigned char FillVal; /* Value to use for fill bytes */
- unsigned char AddrSize; /* Address size of segment */
+ unsigned long Alignment; /* Alignment needed */
+ unsigned char FillVal; /* Value to use for fill bytes */
+ unsigned char AddrSize; /* Address size of segment */
unsigned char ReadOnly; /* True for readonly segments (config) */
- unsigned char Relocatable; /* True if the segment is relocatable */
- unsigned char Placed; /* Did we place this segment already? */
- unsigned char Dumped; /* Did we dump this segment? */
+ unsigned char Dumped; /* Did we dump this segment? */
};
/* Section structure (a section is a part of a segment) */
typedef struct Section Section;
struct Section {
- Section* Next; /* List of sections in a segment */
- Segment* Seg; /* Segment that contains the section */
+ Section* Next; /* List of sections in a segment */
+ Segment* Seg; /* Segment that contains the section */
struct ObjData* Obj; /* Object file this section comes from */
- struct Fragment* FragRoot; /* Fragment list */
- struct Fragment* FragLast; /* Pointer to last fragment */
- unsigned long Offs; /* Offset into the segment */
- unsigned long Size; /* Size of the section */
+ struct Fragment* FragRoot; /* Fragment list */
+ struct Fragment* FragLast; /* Pointer to last fragment */
+ unsigned long Offs; /* Offset into the segment */
+ unsigned long Size; /* Size of the section */
unsigned long Fill; /* Fill bytes for alignment */
- unsigned char Align; /* Alignment */
- unsigned char AddrSize; /* Address size of segment */
+ unsigned long Alignment; /* Alignment */
+ unsigned char AddrSize; /* Address size of segment */
};
/* Prototype for a function that is used to write expressions to the target
* file (used in SegWrite). It returns one of the following values:
*/
-#define SEG_EXPR_OK 0U /* Ok */
-#define SEG_EXPR_RANGE_ERROR 1U /* Range error */
-#define SEG_EXPR_TOO_COMPLEX 2U /* Expression too complex */
+#define SEG_EXPR_OK 0U /* Ok */
+#define SEG_EXPR_RANGE_ERROR 1U /* Range error */
+#define SEG_EXPR_TOO_COMPLEX 2U /* Expression too complex */
#define SEG_EXPR_INVALID 3U /* Expression is invalid (e.g. unmapped segment) */
-typedef unsigned (*SegWriteFunc) (ExprNode* E, /* The expression to write */
- int Signed, /* Signed expression? */
- unsigned Size, /* Size (=range) */
- unsigned long Offs, /* File offset */
- void* Data); /* Callers data */
+typedef unsigned (*SegWriteFunc) (ExprNode* E, /* The expression to write */
+ int Signed, /* Signed expression? */
+ unsigned Size, /* Size (=range) */
+ unsigned long Offs, /* File offset */
+ void* Data); /* Callers data */
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
* message and may be NULL if the segment is linker generated.
*/
-Section* NewSection (Segment* Seg, unsigned char Align, unsigned char AddrSize);
+Section* NewSection (Segment* Seg, unsigned long Alignment, unsigned char AddrSize);
/* Create a new section for the given segment */
Section* ReadSection (FILE* F, struct ObjData* O);
* called (see description of SegWriteFunc above).
*/
+unsigned SegmentCount (void);
+/* Return the total number of segments */
+
void PrintSegmentMap (FILE* F);
/* Print a segment map to the given file */
/* End of segments.h */
#endif
-
-
-
-