00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef LSYMBOLTABLE_H
00027 #define LSYMBOLTABLE_H
00028
00029 #include <stdio.h>
00030 #include <string.h>
00031 #include "legoErr.H"
00032
00033 enum importTypes {
00034 LIR_GLOBAL,
00035 LIR_GNU_WEAK,
00036 LIR_LOCAL
00037 };
00038
00039 enum tableTypes {
00040 LIR_PROC,
00041 LIR_MODULE
00042 };
00043
00044
00045 enum sDataTypes {
00046 LIR_DATA,
00047 LIR_DATA1,
00048 LIR_BSS,
00049 LIR_TEXT,
00050 LIR_SDATA,
00051 LIR_SBSS,
00052 LIR_COMMENT,
00053 LIR_CTORS,
00054 LIR_DTORS
00055 };
00056
00057 enum varTypes {
00058 LIR_VOID,
00059 LIR_BYTE,
00060 LIR_USBYTE,
00061 LIR_WORD,
00062 LIR_USWORD,
00063 LIR_LONG,
00064 LIR_USLONG,
00065 LIR_LONGLONG,
00066 LIR_USLONGLONG,
00067 LIR_FLOAT,
00068 LIR_DOUBLE,
00069 LIR_STRING,
00070 LIR_STRINGASINT,
00071 LIR_LABEL,
00072 LIR_LABELASINT,
00073 };
00074
00075 enum initTypes {
00076 LIR_WRITTEN,
00077 LIR_PLACED
00078 };
00079
00080
00081
00082
00083
00084
00085
00086 class datum
00087 {
00088 enum varTypes varType;
00089 int offset;
00090 int isDummy;
00091 class datum *next;
00092 union
00093 {
00094 long Byte;
00095 long usByte;
00096 long Word;
00097 long usWord;
00098 long Long;
00099 unsigned long usLong;
00100 long long Longlong;
00101 unsigned long long usLonglong;
00102 float Float;
00103 double Double;
00104 char *String;
00105 char *Label;
00106 };
00107
00108 public:
00109
00110 datum()
00111 {
00112
00113 varType = LIR_LONG;
00114 offset = -1;
00115 isDummy = 0;
00116 next = NULL;
00117 usLonglong = 0;
00118 }
00119 datum (const datum &oldD)
00120 {
00121
00122 varType = oldD.varType;
00123 offset = oldD.offset;
00124 isDummy = oldD.isDummy;
00125 if (varType != LIR_STRING && varType != LIR_STRINGASINT &&
00126 varType != LIR_LABEL && varType != LIR_LABELASINT)
00127 usLonglong = oldD.usLonglong;
00128 else
00129 {
00130 String = new char [strlen (oldD.String) + 1];
00131 strcpy (String, oldD.String);
00132 }
00133 next = new datum (*(oldD.next));
00134 }
00135
00136 ~datum()
00137 {
00138 datum *temp;
00139
00140 if (varType == LIR_STRING || varType == LIR_STRINGASINT ||
00141 varType == LIR_LABEL || varType == LIR_LABELASINT)
00142 delete[] String;
00143 while (next != NULL)
00144 {
00145 temp = next;
00146 next = temp->next;
00147 temp->next = NULL;
00148 delete temp;
00149 }
00150
00151
00152 }
00153
00154 enum varTypes GetVarType (void) {return varType;}
00155 void SetVarType (enum varTypes vt) {varType = vt;}
00156
00157 int GetOffset (void) {return offset;}
00158 void SetOffset (int o) {offset = o;}
00159
00160 int IsDummy (void) {return isDummy;}
00161 void SetDummy (int d) {isDummy = d;}
00162
00163 datum *GetNext (void) {return next;}
00164 void SetNext (datum *n) {next = n;}
00165
00166
00167
00168
00169
00170
00171
00172 long GetByte (void) {return Byte;}
00173 void SetByte (long b) {Byte = b;}
00174
00175 long GetUsByte (void) {return usByte;}
00176 void SetUsByte (long b) {usByte = b;}
00177
00178 long GetWord (void) {return Word;}
00179 void SetWord (long w) {Word = w;}
00180
00181 long GetUsWord (void) {return usWord;}
00182 void SetUsWord (long w) {usWord = w;}
00183
00184 long GetLong (void) {return Long;}
00185 void SetLong (long l) {Long = l;}
00186
00187 unsigned long GetUsLong (void) {return usLong;}
00188 void SetUsLong (unsigned long l) {usLong = l;}
00189
00190 long long GetLongLong (void) {return Longlong;}
00191 void SetLongLong (long long l) {Longlong = l;}
00192
00193 unsigned long long GetUsLongLong (void) {return usLonglong;}
00194 void SetUsLongLong (unsigned long long l) {usLonglong = l;}
00195
00196 float GetFloat (void) {return Float;}
00197 void SetFloat (float f) {Float = f;}
00198
00199 double GetDouble (void) {return Double;}
00200 void SetDouble (double d) {Double = d;}
00201
00202 char *GetString (void) {return String;}
00203 void SetString (char *s)
00204 {
00205 if (varType == LIR_STRING || varType == LIR_STRINGASINT)
00206 delete[] String;
00207 if (varType == LIR_LABEL || varType == LIR_LABELASINT)
00208 delete[] Label;
00209 if (s != NULL)
00210 {
00211 String = new char [strlen (s) + 1];
00212 strcpy (String, s);
00213 }
00214 else String = NULL;
00215 }
00216
00217 char *GetLabel (void) {return Label;}
00218 void SetLabel (char *s)
00219 {
00220 if (varType == LIR_STRING || varType == LIR_STRINGASINT)
00221 delete[] String;
00222 if (varType == LIR_LABEL || varType == LIR_LABELASINT)
00223 delete[] Label;
00224 if (s != NULL)
00225 {
00226 Label = new char [strlen (s) + 1];
00227 strcpy (Label, s);
00228 }
00229 else Label = NULL;
00230 }
00231
00232
00233
00234 datum *FindOffset (int o)
00235 {
00236 datum *candidate;
00237
00238 for (candidate = this; candidate != NULL;
00239 candidate = candidate->next)
00240 {
00241 if ((candidate->offset == o) && !(candidate->isDummy))
00242 return candidate;
00243 }
00244 }
00245
00246
00247
00248 datum *FindIndex (int idx, int elsize)
00249 {
00250 return FindOffset (idx * elsize);
00251 }
00252
00253
00254
00255 void Append (datum *newd)
00256 {
00257 datum *tail;
00258
00259 for (tail = this; tail->next != NULL; tail = tail->next) ;
00260 tail->next = newd;
00261 return;
00262 }
00263
00264
00265 void WriteRebel (FILE *, char *, int);
00266 };
00267
00268 class symbolTable;
00269
00270
00271
00272
00273
00274
00275 class nameTable {
00276
00277 char *varName;
00278 int elementSize;
00279 int reserve;
00280 int numElements;
00281 int align;
00282
00283
00284 char *info;
00285 enum importTypes importType;
00286 symbolTable* STPtr;
00287
00288 int numData;
00289 int totalSize;
00290 datum *data;
00291 datum *datatail;
00292
00293 public:
00294
00295 nameTable()
00296 {
00297 varName = NULL;
00298
00299
00300 elementSize = 0;
00301 reserve = 0;
00302 numElements = 0;
00303
00304 align = 0;
00305 info = NULL;
00306 importType = LIR_LOCAL;
00307 STPtr = NULL;
00308
00309 numData = 0;
00310 totalSize = 0;
00311 data = NULL;
00312 datatail = NULL;
00313 }
00314 ~nameTable()
00315 {
00316 delete[] varName;
00317 delete data;
00318
00319 if(info != NULL) delete [] info;
00320
00321 }
00322
00323
00324
00325
00326 nameTable(const nameTable &oldVar)
00327 {
00328 if (oldVar.varName != NULL)
00329 {
00330 varName = new char[strlen(oldVar.varName)+1];
00331 strcpy(varName,oldVar.varName);
00332 }
00333 else
00334 varName = NULL;
00335 elementSize = oldVar.elementSize;
00336 reserve = oldVar.reserve;
00337 numElements = oldVar.numElements;
00338 align = oldVar.align;
00339 info = oldVar.info;
00340 importType = oldVar.importType;
00341 STPtr = oldVar.STPtr;
00342 numData = oldVar.numData;
00343 totalSize = oldVar.totalSize;
00344 if (oldVar.data != NULL)
00345 {
00346 data = new datum (*(oldVar.data));
00347 for (datatail = data; datatail->GetNext() != NULL;
00348 datatail = datatail->GetNext()) ;
00349 }
00350 else
00351 data = datatail = NULL;
00352
00353 }
00354
00355
00356
00357
00358 nameTable& operator=(const nameTable& oldVar)
00359 {
00360 if ( varName != oldVar.varName ) {
00361 delete[] varName;
00362 if (oldVar.varName != NULL)
00363 {
00364 varName = new char[strlen(oldVar.varName)+1];
00365 strcpy(varName,oldVar.varName);
00366 }
00367 else
00368 varName = NULL;
00369 elementSize = oldVar.elementSize;
00370 reserve = oldVar.reserve;
00371 numElements = oldVar.numElements;
00372 align = oldVar.align;
00373 info = oldVar.info;
00374 importType = oldVar.importType;
00375 STPtr = oldVar.STPtr;
00376 numData = oldVar.numData;
00377 totalSize = oldVar.totalSize;
00378 delete data;
00379 if (oldVar.data != NULL)
00380 {
00381 data = new datum (*(oldVar.data));
00382 for (datatail = data; datatail->GetNext() != NULL;
00383 datatail = datatail->GetNext()) ;
00384 }
00385 else
00386 data = datatail = NULL;
00387 }
00388 return *this;
00389 }
00390
00391
00392
00393 void SetVarName(char *newVarName) {
00394 delete[] varName;
00395 if (newVarName != NULL)
00396 {
00397 varName = new char[strlen(newVarName)+1];
00398 strcpy(varName,newVarName);
00399 }
00400 else varName = NULL;
00401 }
00402
00403
00404
00405 void SetElementSize(int newElementSize)
00406 {
00407 elementSize = newElementSize;
00408 }
00409
00410 void SetReserve(int newReserve)
00411 {
00412 reserve = newReserve;
00413 }
00414
00415 void SetNumElements(int newNumElements)
00416 { numElements = newNumElements; }
00417
00418 void SetAlign(int newAlign) { align = newAlign; }
00419
00420
00421
00422 void SetInfo(char *newInfo)
00423 {
00424 if(info != NULL)
00425 {
00426 delete [] info;
00427 info = NULL;
00428 }
00429 if(newInfo != NULL)
00430 {
00431 info = new char[strlen(newInfo) + 1];
00432 strcpy(info, newInfo);
00433 }
00434 }
00435
00436 void AppendInfo(char *newInfo)
00437 {
00438 char *a;
00439
00440 if(info != NULL)
00441 {
00442 a = new char[strlen(info) + strlen(newInfo) + 1];
00443 strcpy(a, info);
00444 strcat(a, newInfo);
00445 delete [] info;
00446 info = a;
00447 }
00448 else
00449 {
00450 info = new char[strlen(newInfo) + 1];
00451 strcpy(info, newInfo);
00452 }
00453 }
00454
00455 void SetImportType(enum importTypes newImportType)
00456 { importType = newImportType; }
00457
00458 void SetSTPtr(symbolTable *newTablePtr) { STPtr = newTablePtr; }
00459
00460 void SetNumData(int newNumData) { numData = newNumData; }
00461
00462 void SetTotalSize(int newTotalSize) { totalSize = newTotalSize; }
00463
00464
00465
00466
00467 void SetOffset (enum varTypes, int, void *, int = 1);
00468 void SetArray (enum varTypes, int, void *, int = 1);
00469
00470 datum *GetOffset (int offset)
00471 {
00472 if (data != NULL)
00473 return data->FindOffset (offset);
00474 else
00475 return NULL;
00476 }
00477
00478 datum *GetArray (enum varTypes, int);
00479
00480
00481
00482 char *GetVarName(void) { return varName; }
00483
00484
00485
00486 int GetElementSize(void) {return elementSize; }
00487
00488 int GetReserve(void) { return reserve; }
00489
00490 int GetNumElements(void) { return numElements; }
00491
00492 int GetAlign(void) { return align; }
00493
00494
00495
00496 char *GetInfo(void) { return info; }
00497
00498 int GetImportType(void) { return importType; }
00499
00500 symbolTable *GetSTPtr(void) { return STPtr; }
00501
00502 int GetNumData(void) { return numData; }
00503
00504 int GetTotalSize(void) { return totalSize; }
00505
00506 datum *GetData(void) { return data; }
00507
00508 datum *GetDataTail(void) { return datatail; }
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670 int InitType(void)
00671 {
00672 if (numElements != 0) return LIR_PLACED;
00673 else return LIR_WRITTEN;
00674 }
00675
00676 void ClearData (void)
00677 {
00678 delete data;
00679 data = datatail = NULL;
00680 numData = 0;
00681 totalSize = 0;
00682 }
00683
00684
00685 void WriteRebel (FILE *);
00686 };
00687
00688
00689
00690 class symbolTable {
00691
00692 char *regionName;
00693 enum tableTypes tableType;
00694 enum sDataTypes sDataType;
00695 int varCount;
00696 int tableSize;
00697 int parmCount;
00698 nameTable **varTablePtr;
00699
00700 public:
00701
00702
00703
00704
00705 symbolTable()
00706 {
00707 regionName = NULL;
00708 tableType = LIR_PROC;
00709 sDataType = LIR_DATA;
00710 varCount = 0;
00711 tableSize = 10;
00712 parmCount = 0;
00713 varTablePtr = new nameTable*[tableSize];
00714 }
00715
00716
00717
00718
00719 symbolTable(int initSize)
00720 {
00721 regionName = NULL;
00722 tableType = LIR_PROC;
00723 sDataType = LIR_DATA;
00724 varCount = 0;
00725 tableSize = initSize;
00726 parmCount = 0;
00727 varTablePtr = new nameTable*[tableSize];
00728 }
00729
00730 ~symbolTable()
00731 {
00732 delete[] regionName;
00733 for (int i = 0; i < varCount; i++)
00734 delete varTablePtr[i];
00735 delete[] varTablePtr;
00736 }
00737
00738
00739
00740
00741
00742
00743
00744 void AddVar(nameTable *inputVar)
00745 {
00746 if ( varCount >= (tableSize - 1) ) {
00747
00748 ResizeNameTable();
00749 }
00750 varTablePtr[varCount] = inputVar;
00751 varCount++;
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763 }
00764
00765
00766
00767 void SetRegionName (char *newRegionName) {
00768 delete[] regionName;
00769 if (newRegionName != NULL)
00770 {
00771 regionName = new char[strlen(newRegionName)+1];
00772 strcpy(regionName,newRegionName);
00773 }
00774 else regionName = NULL;
00775 }
00776
00777
00778
00779
00780 void SetTableType(enum tableTypes newTableType) { tableType = newTableType; }
00781
00782
00783
00784
00785 void SetSDataType(enum sDataTypes newDataType) { sDataType = newDataType; }
00786
00787
00788
00789
00790
00791
00792 void SetVarCount(int newVarCount) { varCount = newVarCount; }
00793
00794
00795
00796
00797
00798
00799 void SetTableSize(int newTableSize)
00800 {
00801 if (newTableSize < varCount) {
00802 LegoNonFatal ("nameTable::SetTableSize",
00803 "New size of nameTable too small.");
00804 return;
00805 }
00806 nameTable **tmpVarTablePtr = new nameTable*[newTableSize];
00807 if ( varCount != 0 ) {
00808 for (int idx=0; idx<varCount; idx++) {
00809 tmpVarTablePtr[idx] = varTablePtr[idx];
00810 }
00811 }
00812 delete [] varTablePtr;
00813 varTablePtr = tmpVarTablePtr;
00814 tableSize = newTableSize;
00815 }
00816
00817
00818
00819
00820 void SetParmCount(int newParmCount) { parmCount = newParmCount; }
00821
00822
00823
00824
00825 void IncParmCount(void) { parmCount++; }
00826
00827
00828
00829
00830
00831
00832
00833
00834 char *GetRegionName(void) { return regionName; }
00835
00836
00837
00838
00839 enum tableTypes GetTableType(void) { return tableType; }
00840
00841
00842
00843
00844 enum sDataTypes GetSDataType(void) { return sDataType; }
00845
00846
00847
00848
00849 int GetVarCount(void) { return varCount; }
00850
00851
00852
00853
00854 int GetTableSize(void) { return tableSize; }
00855
00856
00857
00858
00859 int GetParmCount(void) { return parmCount; }
00860
00861
00862
00863
00864 nameTable **GetVarTablePtr(void) { return varTablePtr; }
00865
00866
00867
00868 nameTable *GetVarTablePtr(int indx) { return varTablePtr[indx]; }
00869
00870
00871
00872
00873 void ResizeNameTable(void)
00874 {
00875 nameTable **tmpVarTablePtr = new nameTable*[2 * tableSize];
00876 if ( varCount != 0 ) {
00877 for (int idx=0; idx<varCount; idx++) {
00878 tmpVarTablePtr[idx] = varTablePtr[idx];
00879 }
00880 }
00881 delete [] varTablePtr;
00882 varTablePtr = tmpVarTablePtr;
00883 tableSize = 2 * tableSize;
00884 }
00885
00886
00887
00888
00889 void ResizeVariableArray(int entryIdx, int newElementSize);
00890
00891
00892
00893 nameTable *LocateVar (char *name)
00894 {
00895 int i;
00896 nameTable *candidate;
00897
00898 for (i = 0; i < parmCount; i++)
00899 {
00900 candidate = varTablePtr[i];
00901 if (candidate == NULL) continue;
00902 if (strcmp (candidate->GetVarName(), name) == 0)
00903 return candidate;
00904 }
00905 return NULL;
00906 }
00907
00908
00909 void symbolTable::WriteRebel (FILE *rebelfile)
00910 {
00911 int i;
00912
00913 fprintf (rebelfile," (ms ");
00914 switch (sDataType)
00915 {
00916 case LIR_DATA:
00917 fprintf (rebelfile, "data)\n"); break;
00918 case LIR_DATA1:
00919 fprintf (rebelfile, "data1)\n"); break;
00920 case LIR_BSS:
00921 fprintf (rebelfile, "bss)\n"); break;
00922 case LIR_TEXT:
00923 fprintf (rebelfile, "text)\n"); break;
00924
00925
00926 case LIR_SDATA:
00927 fprintf (rebelfile, "sdata)\n"); break;
00928 case LIR_SBSS:
00929 fprintf (rebelfile, "sbss)\n"); break;
00930 case LIR_COMMENT:
00931 fprintf (rebelfile, "dcomment)\n"); break;
00932 case LIR_CTORS:
00933 fprintf (rebelfile, "ctors)\n"); break;
00934 case LIR_DTORS:
00935 fprintf (rebelfile, "dtors)\n"); break;
00936 default:
00937 fprintf(stderr, "WriteRebel Error: data type unrecognized.\n");
00938 exit (-1);
00939 }
00940
00941 for (i = 0; i < varCount; i++)
00942 varTablePtr[i]->WriteRebel (rebelfile);
00943 return;
00944 }
00945
00946 };
00947
00948 class tableEntry {
00949
00950 symbolTable *tablePtr;
00951 int entryIndex;
00952
00953 public:
00954
00955 tableEntry() {
00956 tablePtr = NULL;
00957 entryIndex = 0;
00958 }
00959
00960 ~tableEntry() {}
00961
00962
00963
00964
00965 void SetTablePtr(symbolTable *newTablePtr) { tablePtr = newTablePtr; }
00966
00967
00968
00969
00970 void SetEntryIndex(int newEntryIndex) { entryIndex = newEntryIndex; }
00971
00972
00973
00974
00975 symbolTable *GetTablePtr(void) { return tablePtr; }
00976
00977
00978
00979
00980 int GetEntryIndex(void) { return entryIndex; }
00981 };
00982
00983 #endif // LSYMBOLTABLE_H
00984