Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1126 | savelij | 1 | /* asmlabel.c */ |
2 | /*****************************************************************************/ |
||
3 | /* SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only */ |
||
4 | /* */ |
||
5 | /* AS Port */ |
||
6 | /* */ |
||
7 | /* Handle Label on Source Line */ |
||
8 | /* */ |
||
9 | /*****************************************************************************/ |
||
10 | |||
11 | /* ------------------------------------------------------------------------ |
||
12 | * Includes |
||
13 | * ------------------------------------------------------------------------ */ |
||
14 | |||
15 | #include "stdinc.h" |
||
16 | #include <string.h> |
||
17 | |||
18 | #include "asmdef.h" |
||
19 | #include "asmsub.h" |
||
20 | #include "asmpars.h" |
||
21 | #include "asmstructs.h" |
||
22 | #include "strcomp.h" |
||
23 | |||
24 | #include "asmlabel.h" |
||
25 | |||
26 | /* ------------------------------------------------------------------------ |
||
27 | * Local Variables |
||
28 | * ------------------------------------------------------------------------ */ |
||
29 | |||
30 | static PStructElem pLabelElement; |
||
31 | static struct sSymbolEntry *pLabelEntry; |
||
32 | static LargeWord LabelValue; |
||
33 | |||
34 | /* ------------------------------------------------------------------------ |
||
35 | * Global Functions |
||
36 | * ------------------------------------------------------------------------ */ |
||
37 | |||
38 | /*!------------------------------------------------------------------------ |
||
39 | * \fn LabelReset(void) |
||
40 | * \brief reset state about most recent label |
||
41 | * ------------------------------------------------------------------------ */ |
||
42 | |||
43 | void LabelReset(void) |
||
44 | { |
||
45 | pLabelElement = NULL; |
||
46 | pLabelEntry = NULL; |
||
47 | LabelValue = (LargeWord)-1; |
||
48 | } |
||
49 | |||
50 | /*!------------------------------------------------------------------------ |
||
51 | * \fn LabelPresent(void) |
||
52 | * \brief check whether line contains a label |
||
53 | * \return True if label is present |
||
54 | * ------------------------------------------------------------------------ */ |
||
55 | |||
56 | Boolean LabelPresent(void) |
||
57 | { |
||
58 | if (!*LabPart.str.p_str) |
||
59 | return False; |
||
60 | if (IsDef()) |
||
61 | return False; |
||
62 | |||
63 | switch (*OpPart.str.p_str) |
||
64 | { |
||
65 | case '=': |
||
66 | return !Memo("="); |
||
67 | case ':': |
||
68 | return !Memo(":="); |
||
69 | case '.': |
||
70 | return !Memo(".SET") && !Memo(".EQU"); |
||
71 | case 'M': |
||
72 | return !Memo("MACRO"); |
||
73 | case 'F': |
||
74 | return !Memo("FUNCTION"); |
||
75 | case 'L': |
||
76 | return !Memo("LABEL"); |
||
77 | case 'S': |
||
78 | return !memo_set_pseudo() && (!(Memo("STRUCT") || Memo("STRUC"))); |
||
79 | case 'E': |
||
80 | if (Memo("EQU") || Memo("ENDSTRUCT") || Memo("ENDS") || Memo("ENDSTRUC") || Memo("ENDUNION")) |
||
81 | return False; |
||
82 | return !Memo("EVAL"); |
||
83 | case 'U': |
||
84 | return !Memo("UNION"); |
||
85 | default: |
||
86 | return True; |
||
87 | } |
||
88 | } |
||
89 | |||
90 | /*!------------------------------------------------------------------------ |
||
91 | * \fn LabelHandle(const tStrComp *pName, LargeWord Value, Boolean ForceGlobal) |
||
92 | * \brief process new label |
||
93 | * \param pName label's name |
||
94 | * \param Value label's value |
||
95 | * \param ForceGlobal force visibility outside macro body |
||
96 | * ------------------------------------------------------------------------ */ |
||
97 | |||
98 | void LabelHandle(const tStrComp *pName, LargeWord Value, Boolean ForceGlobal) |
||
99 | { |
||
100 | pLabelElement = NULL; |
||
101 | pLabelEntry = NULL; |
||
102 | |||
103 | /* structure element ? */ |
||
104 | |||
105 | if (pInnermostNamedStruct) |
||
106 | { |
||
107 | pLabelElement = CreateStructElem(pName); |
||
108 | if (!pLabelElement) |
||
109 | return; |
||
110 | |||
111 | pLabelElement->Offset = Value; |
||
112 | if (AddStructElem(pInnermostNamedStruct->StructRec, pLabelElement)) |
||
113 | AddStructSymbol(pLabelElement->pElemName, Value); |
||
114 | } |
||
115 | |||
116 | /* normal label */ |
||
117 | |||
118 | else |
||
119 | { |
||
120 | if (ForceGlobal) |
||
121 | PushLocHandle(-1); |
||
122 | if (RelSegs) |
||
123 | pLabelEntry = EnterRelSymbol(pName, Value, (as_addrspace_t)ActPC, False); |
||
124 | else |
||
125 | { |
||
126 | pLabelEntry = EnterIntSymbolWithFlags(pName, Value, (as_addrspace_t)ActPC, False, |
||
127 | eSymbolFlag_Label | |
||
128 | (Value == AfterBSRAddr ? eSymbolFlag_NextLabelAfterBSR : eSymbolFlag_None)); |
||
129 | } |
||
130 | if (ForceGlobal) |
||
131 | PopLocHandle(); |
||
132 | } |
||
133 | LabelValue = Value; |
||
134 | } |
||
135 | |||
136 | /*!------------------------------------------------------------------------ |
||
137 | * \fn LabelModify(LargeWord OldValue, LargeWord NewValue) |
||
138 | * \brief change value of current label |
||
139 | * \param OldValue current value to check consistency |
||
140 | * \param NewValue new value to assign |
||
141 | * ------------------------------------------------------------------------ */ |
||
142 | |||
143 | void LabelModify(LargeWord OldValue, LargeWord NewValue) |
||
144 | { |
||
145 | if (OldValue == LabelValue) |
||
146 | { |
||
147 | if (pLabelElement) |
||
148 | pLabelElement->Offset = NewValue; |
||
149 | if (pLabelEntry) |
||
150 | ChangeSymbol(pLabelEntry, NewValue); |
||
151 | LabelValue = NewValue; |
||
152 | } |
||
153 | } |
||
154 | |||
155 | /*!------------------------------------------------------------------------ |
||
156 | * \fn AsmLabelPassInit(void) |
||
157 | * \brief Initializations before passing through sources |
||
158 | * ------------------------------------------------------------------------ */ |
||
159 | |||
160 | void AsmLabelPassInit(void) |
||
161 | { |
||
162 | LabelReset(); |
||
163 | } |
||
164 | |||
165 | /*!------------------------------------------------------------------------ |
||
166 | * \fn asmlabel_init(void) |
||
167 | * \brief Initializations once at startup |
||
168 | * ------------------------------------------------------------------------ */ |
||
169 | |||
170 | void asmlabel_init(void) |
||
171 | { |
||
172 | LabelReset(); |
||
173 | } |