/*****************************************************************************/
/* */
-/* segments.h */
+/* segments.h */
/* */
-/* Segment management */
+/* Segment management */
/* */
/* */
/* */
-/* (C) 2000-2002 Ullrich von Bassewitz */
-/* Wacholderweg 14 */
-/* D-70597 Stuttgart */
-/* EMail: uz@cc65.org */
+/* (C) 2000-2009, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
/*****************************************************************************/
-/* Forwards */
+/* Forwards */
/*****************************************************************************/
/*****************************************************************************/
-/* Data */
+/* Data */
/*****************************************************************************/
/* A list of all segments used when generating code */
typedef struct Segments Segments;
struct Segments {
- struct TextSeg* Text; /* Text segment */
- struct CodeSeg* Code; /* Code segment */
- struct DataSeg* Data; /* Data segment */
- struct DataSeg* ROData; /* Readonly data segment */
- struct DataSeg* BSS; /* Segment for uninitialized data */
- segment_t CurDSeg; /* Current data segment */
+ struct TextSeg* Text; /* Text segment */
+ struct CodeSeg* Code; /* Code segment */
+ struct DataSeg* Data; /* Data segment */
+ struct DataSeg* ROData; /* Readonly data segment */
+ struct DataSeg* BSS; /* Segment for uninitialized data */
+ segment_t CurDSeg; /* Current data segment */
};
/* Pointer to the current segment list. Output goes here. */
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
void InitSegNames (void);
/* Initialize the segment names */
-void NewSegName (segment_t Seg, const char* Name);
+void SetSegName (segment_t Seg, const char* Name);
/* Set a new name for a segment */
+void PushSegName (segment_t Seg, const char* Name);
+/* Push the current segment name and set a new name for a segment */
+
+void PopSegName (segment_t Seg);
+/* Restore a segment name from the segment name stack */
+
+const char* GetSegName (segment_t Seg);
+/* Get the name of the given segment */
+
Segments* PushSegments (struct SymEntry* Func);
/* Make the new segment list current but remember the old one */
void PopSegments (void);
/* Pop the old segment list (make it current) */
+void CreateGlobalSegments (void);
+/* Create the global segments and remember them in GS */
+
void UseDataSeg (segment_t DSeg);
/* For the current segment list, use the data segment DSeg */
void AddDataLine (const char* Format, ...) attribute ((format (printf, 1, 2)));
/* Add a line of data to the current data segment */
-void OutputSegments (const Segments* S, FILE* F);
-/* Output the given segments to the file */
+int HaveGlobalCode (void);
+/* Return true if the global code segment contains entries (which is an error) */
+
+void RemoveGlobalCode (void);
+/* Remove all code from the global code segment. Used for error recovery. */
+
+void OutputSegments (const Segments* S);
+/* Output the given segments to the output file */