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 */
85 /*****************************************************************************/
87 /*****************************************************************************/
91 CodeSeg* NewCodeSeg (const char* SegName, SymEntry* Func);
92 /* Create a new code segment, initialize and return it */
94 void AddCodeEntry (CodeSeg* S, const char* Format, va_list ap) attribute ((format(printf,2,0)));
95 /* Add a line to the given code segment */
97 void InsertCodeEntry (CodeSeg* S, struct CodeEntry* E, unsigned Index);
98 /* Insert the code entry at the index given. Following code entries will be
99 * moved to slots with higher indices.
102 void DelCodeEntry (CodeSeg* S, unsigned Index);
103 /* Delete an entry from the code segment. This includes moving any associated
104 * labels, removing references to labels and even removing the referenced labels
105 * if the reference count drops to zero.
108 struct CodeEntry* GetCodeEntry (CodeSeg* S, unsigned Index);
109 /* Get an entry from the given code segment */
111 struct CodeEntry* GetNextCodeEntry (CodeSeg* S, unsigned Index);
112 /* Get the code entry following the one with the index Index. If there is no
113 * following code entry, return NULL.
116 unsigned GetCodeEntryIndex (CodeSeg* S, struct CodeEntry* E);
117 /* Return the index of a code entry */
119 void AddCodeLabel (CodeSeg* S, const char* Name);
120 /* Add a code label for the next instruction to follow */
122 CodeLabel* GenCodeLabel (CodeSeg* S, struct CodeEntry* E);
123 /* If the code entry E does already have a label, return it. Otherwise
124 * create a new label, attach it to E and return it.
127 void DelCodeLabel (CodeSeg* S, CodeLabel* L);
128 /* Remove references from this label and delete it. */
130 void MergeCodeLabels (CodeSeg* S);
131 /* Merge code labels. That means: For each instruction, remove all labels but
132 * one and adjust references accordingly.
135 void MoveCodeLabels (CodeSeg* S, struct CodeEntry* Old, struct CodeEntry* New);
136 /* Move all labels from Old to New. The routine will move the labels itself
137 * if New does not have any labels, and move references if there is at least
138 * a label for new. If references are moved, the old label is deleted
142 void RemoveCodeLabelRef (CodeSeg* S, struct CodeEntry* E);
143 /* Remove the reference between E and the label it jumps to. The reference
144 * will be removed on both sides and E->JumpTo will be 0 after that. If
145 * the reference was the only one for the label, the label will get
149 void MoveCodeLabelRef (CodeSeg* S, struct CodeEntry* E, CodeLabel* L);
150 /* Change the reference of E to L instead of the current one. If this
151 * was the only reference to the old label, the old label will get
155 void AddCodeSegHint (CodeSeg* S, unsigned Hint);
156 /* Add a hint for the preceeding instruction */
158 void DelCodeSegAfter (CodeSeg* S, unsigned Last);
159 /* Delete all entries including the given one */
161 void OutputCodeSeg (const CodeSeg* S, FILE* F);
162 /* Output the code segment data to a file */
164 unsigned GetCodeEntryCount (const CodeSeg* S);
165 /* Return the number of entries for the given code segment */
169 /* End of codeseg.h */