1 /*****************************************************************************/
5 /* Code segment structure */
9 /* (C) 2001 Ullrich von Bassewitz */
11 /* D-70597 Stuttgart */
12 /* EMail: uz@cc65.org */
15 /* This software is provided 'as-is', without any expressed or implied */
16 /* warranty. In no event will the authors be held liable for any damages */
17 /* arising from the use of this software. */
19 /* Permission is granted to anyone to use this software for any purpose, */
20 /* including commercial applications, and to alter it and redistribute it */
21 /* freely, subject to the following restrictions: */
23 /* 1. The origin of this software must not be misrepresented; you must not */
24 /* claim that you wrote the original software. If you use this software */
25 /* in a product, an acknowledgment in the product documentation would be */
26 /* appreciated but is not required. */
27 /* 2. Altered source versions must be plainly marked as such, and must not */
28 /* be misrepresented as being the original software. */
29 /* 3. This notice may not be removed or altered from any source */
32 /*****************************************************************************/
54 /*****************************************************************************/
56 /*****************************************************************************/
64 /*****************************************************************************/
66 /*****************************************************************************/
70 /* Size of the label hash table */
71 #define CS_LABEL_HASH_SIZE 29
73 /* Code segment structure */
74 typedef struct CodeSeg CodeSeg;
76 char* SegName; /* Segment name */
77 SymEntry* Func; /* Owner function */
78 Collection Entries; /* List of code entries */
79 Collection Labels; /* Labels for next insn */
80 CodeLabel* LabelHash [CS_LABEL_HASH_SIZE]; /* Label hash table */
81 unsigned char ExitRegs; /* Register use on exit */
86 /*****************************************************************************/
88 /*****************************************************************************/
92 CodeSeg* NewCodeSeg (const char* SegName, SymEntry* Func);
93 /* Create a new code segment, initialize and return it */
95 void AddCodeEntry (CodeSeg* S, const char* Format, va_list ap) attribute ((format(printf,2,0)));
96 /* Add a line to the given code segment */
98 void InsertCodeEntry (CodeSeg* S, struct CodeEntry* E, unsigned Index);
99 /* Insert the code entry at the index given. Following code entries will be
100 * moved to slots with higher indices.
103 void DelCodeEntry (CodeSeg* S, unsigned Index);
104 /* Delete an entry from the code segment. This includes moving any associated
105 * labels, removing references to labels and even removing the referenced labels
106 * if the reference count drops to zero.
109 struct CodeEntry* GetCodeEntry (CodeSeg* S, unsigned Index);
110 /* Get an entry from the given code segment */
112 struct CodeEntry* GetNextCodeEntry (CodeSeg* S, unsigned Index);
113 /* Get the code entry following the one with the index Index. If there is no
114 * following code entry, return NULL.
117 unsigned GetCodeEntryIndex (CodeSeg* S, struct CodeEntry* E);
118 /* Return the index of a code entry */
120 void AddCodeLabel (CodeSeg* S, const char* Name);
121 /* Add a code label for the next instruction to follow */
123 CodeLabel* GenCodeLabel (CodeSeg* S, struct CodeEntry* E);
124 /* If the code entry E does already have a label, return it. Otherwise
125 * create a new label, attach it to E and return it.
128 void DelCodeLabel (CodeSeg* S, CodeLabel* L);
129 /* Remove references from this label and delete it. */
131 void MergeCodeLabels (CodeSeg* S);
132 /* Merge code labels. That means: For each instruction, remove all labels but
133 * one and adjust references accordingly.
136 void MoveCodeLabels (CodeSeg* S, struct CodeEntry* Old, struct CodeEntry* New);
137 /* Move all labels from Old to New. The routine will move the labels itself
138 * if New does not have any labels, and move references if there is at least
139 * a label for new. If references are moved, the old label is deleted
143 void RemoveCodeLabelRef (CodeSeg* S, struct CodeEntry* E);
144 /* Remove the reference between E and the label it jumps to. The reference
145 * will be removed on both sides and E->JumpTo will be 0 after that. If
146 * the reference was the only one for the label, the label will get
150 void MoveCodeLabelRef (CodeSeg* S, struct CodeEntry* E, CodeLabel* L);
151 /* Change the reference of E to L instead of the current one. If this
152 * was the only reference to the old label, the old label will get
156 void AddCodeSegHint (CodeSeg* S, unsigned Hint);
157 /* Add a hint for the preceeding instruction */
159 void DelCodeSegAfter (CodeSeg* S, unsigned Last);
160 /* Delete all entries including the given one */
162 void OutputCodeSeg (const CodeSeg* S, FILE* F);
163 /* Output the code segment data to a file */
165 unsigned GetCodeEntryCount (const CodeSeg* S);
166 /* Return the number of entries for the given code segment */
170 /* End of codeseg.h */