Merge pull request #23934 from franksinankaya/gcc_cleanup_18
[platform/upstream/coreclr.git] / src / ilasm / grammar_before.cpp
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 #include <asmparse.h>
5 #include <assembler.h>
6
7 // Disable the "initialization of static local vars is no thread safe" error
8 #ifdef _MSC_VER
9 #pragma warning(disable : 4640)
10 #endif
11
12 #define YYMAXDEPTH 0x80000
13 #define YYLOCAL int
14 //#define YYRECURSIVE
15
16 //#define DEBUG_PARSING
17 #ifdef DEBUG_PARSING
18 bool parseDBFlag = true;
19 #define dbprintf(x)     if (parseDBFlag) printf x
20 #define YYDEBUG 1
21 #else
22 #define dbprintf(x)     
23 #endif
24
25 #define FAIL_UNLESS(cond, msg) if (!(cond)) { parser->success = false; parser->error msg; }
26
27 static AsmParse* parser = 0;
28 #define PASM    (parser->assem)
29 #define PASMM   (parser->assem->m_pManifest)
30 #define PENV    (parser->penv)
31
32
33
34 PFN_NEXTCHAR    nextchar;
35 PFN_SYM         Sym;
36 PFN_NEWSTRFROMTOKEN NewStrFromToken;
37 PFN_NEWSTATICSTRFROMTOKEN NewStaticStrFromToken;
38 PFN_GETDOUBLE   GetDouble;
39
40 void SetFunctionPtrs()
41 {
42     nextchar = PENV->pfn_nextchar;
43     Sym = PENV->pfn_Sym;
44     NewStrFromToken = PENV->pfn_NewStrFromToken;
45     NewStaticStrFromToken = PENV->pfn_NewStaticStrFromToken;
46     GetDouble = PENV->pfn_GetDouble;
47 }    
48     
49
50 static char* newStringWDel(__in __nullterminated char* str1, char delimiter, __in __nullterminated char* str3 = 0);
51 static char* newString(__in __nullterminated const char* str1);
52 static void corEmitInt(BinStr* buff, unsigned data);
53 static void AppendStringWithLength(BinStr* pbs, __in __nullterminated char* sz);
54 bool bParsingByteArray = FALSE;
55 int iOpcodeLen = 0;
56 int iCallConv = 0;
57 unsigned IfEndif = 0;
58 unsigned IfEndifSkip = 0;
59 unsigned nCustomBlobNVPairs = 0;
60 unsigned nSecAttrBlobs = 0;
61 unsigned  nCurrPC = 0;
62 BOOL SkipToken = FALSE;
63 BOOL neg = FALSE;
64 BOOL newclass = FALSE;
65
66 extern unsigned int g_uConsoleCP;
67
68 struct VarName
69 {
70     char* name;
71     BinStr* pbody;
72     VarName(__in_opt __nullterminated char* sz, BinStr* pbs) { name = sz; pbody = pbs; };
73     ~VarName() { delete [] name; delete pbody; };
74     int ComparedTo(VarName* pN) { return strcmp(name,pN->name); };
75 };
76 SORTEDARRAY<VarName> VarNameList;
77 void DefineVar(__in __nullterminated char* sz, BinStr* pbs) { VarNameList.PUSH(new VarName(sz,pbs)); };
78 void UndefVar(__in __nullterminated char* sz) 
79
80     CHECK_LOCAL_STATIC_VAR(static VarName VN(NULL,NULL)); 
81
82     VN.name = sz; 
83     VarNameList.DEL(&VN); 
84     VN.name = NULL; 
85     delete [] sz;
86 }
87 VarName* FindVarDef(__in __nullterminated char* sz)
88 {
89     CHECK_LOCAL_STATIC_VAR(static VarName VN(NULL,NULL));
90
91     VarName* Ret = NULL;
92     VN.name = sz;
93     Ret = VarNameList.FIND(&VN);
94     VN.name = NULL; 
95     delete [] sz;
96     return Ret;
97 }
98 BOOL IsVarDefined(__in __nullterminated char* sz)
99 {
100     return (FindVarDef(sz) != NULL);
101 }
102
103 int  nTemp=0;
104
105 unsigned int uMethodBeginLine,uMethodBeginColumn;
106
107 #define ELEMENT_TYPE_VARFIXUP ELEMENT_TYPE_MAX+2
108 #define ELEMENT_TYPE_MVARFIXUP ELEMENT_TYPE_MAX+3
109
110 FIFO<char> TyParFixupList;
111 void FixupTyPars(PCOR_SIGNATURE pSig, ULONG cSig);
112 void FixupTyPars(BinStr* pbstype);
113 void FixupConstraints()
114 {
115     if((TyParFixupList.COUNT()) && (PASM->m_TyParList))
116     {
117         TyParList* pTPL;
118         for(pTPL = PASM->m_TyParList; pTPL; pTPL=pTPL->Next())
119         {
120             mdToken* ptk;
121             for(ptk = (mdToken*)(pTPL->Bound()->ptr()); *ptk; ptk++)
122             {
123                 if(TypeFromToken(*ptk)==mdtTypeSpec)
124                 {
125                     PCOR_SIGNATURE pSig;
126                     ULONG cSig;
127                     PASM->m_pImporter->GetTypeSpecFromToken(*ptk,(PCCOR_SIGNATURE*)&pSig,&cSig);
128                     if((pSig)&&(cSig))
129                     {
130                         FixupTyPars(pSig,cSig);    
131                     } // end if((pSig)&&(cSig))
132                 } // end if(TypeFromToken(*ptk)==mdtTypeSpec)
133             } //end for(ptk    
134         } // end for(pTPL
135     } //end if((TyParFixupList.COUNT()) 
136 }
137
138 #define SET_PA(x,y,z) {x = (CorAssemblyFlags)(((y) & ~afPA_FullMask)|(z)|afPA_Specified);}