Change TargetAsmInfo to be constructed via TargetRegistry from a Target+Triple
[oota-llvm.git] / lib / Target / PIC16 / PIC16DebugInfo.h
1 //===-- PIC16DebugInfo.h - Interfaces for PIC16 Debug Information ============//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source 
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains the helper functions for representing debug information.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef PIC16DBG_H
15 #define PIC16DBG_H
16
17 #include "llvm/Analysis/DebugInfo.h"
18 #include "llvm/Module.h"
19 #include "llvm/Target/TargetAsmInfo.h" 
20 #include <map>
21
22 namespace llvm {
23   class MachineFunction;
24   class DebugLoc;
25   namespace PIC16Dbg {
26     enum VarType {
27       T_NULL,
28       T_VOID,
29       T_CHAR,
30       T_SHORT,
31       T_INT,
32       T_LONG,
33       T_FLOAT,
34       T_DOUBLE,
35       T_STRUCT,
36       T_UNION,
37       T_ENUM,
38       T_MOE,
39       T_UCHAR,
40       T_USHORT,
41       T_UINT,
42       T_ULONG
43     };
44     enum DerivedType {
45       DT_NONE,
46       DT_PTR,
47       DT_FCN,
48       DT_ARY
49     };
50     enum TypeSize {
51       S_BASIC = 5,
52       S_DERIVED = 3
53     };
54     enum DbgClass {
55       C_NULL,
56       C_AUTO,
57       C_EXT,
58       C_STAT,
59       C_REG,
60       C_EXTDEF,
61       C_LABEL,
62       C_ULABEL,
63       C_MOS,
64       C_ARG,
65       C_STRTAG,
66       C_MOU,
67       C_UNTAG,
68       C_TPDEF,
69       C_USTATIC,
70       C_ENTAG,
71       C_MOE,
72       C_REGPARM,
73       C_FIELD,
74       C_AUTOARG,
75       C_LASTENT,
76       C_BLOCK = 100,
77       C_FCN,
78       C_EOS,
79       C_FILE,
80       C_LINE,
81       C_ALIAS,
82       C_HIDDEN,
83       C_EOF,
84       C_LIST,
85       C_SECTION,
86       C_EFCN = 255
87     };
88     enum SymbolSize {
89       AuxSize =20
90     };
91   }
92
93   class formatted_raw_ostream;
94
95   class PIC16DbgInfo {
96     formatted_raw_ostream &O;
97     const TargetAsmInfo *TAI;
98     std::string CurFile;
99     unsigned CurLine;
100
101     // EmitDebugDirectives is set if debug information is available. Default
102     // value for it is false.
103     bool EmitDebugDirectives;
104
105   public:
106     PIC16DbgInfo(formatted_raw_ostream &o, const TargetAsmInfo *T)
107       : O(o), TAI(T) {
108       CurFile = "";
109       CurLine = 0;
110       EmitDebugDirectives = false; 
111     }
112
113     void BeginModule (Module &M);
114     void BeginFunction (const MachineFunction &MF);
115     void ChangeDebugLoc (const MachineFunction &MF, const DebugLoc &DL,
116                          bool IsInBeginFunction = false);
117     void EndFunction (const MachineFunction &MF);
118     void EndModule (Module &M);
119
120
121     private:
122     void SwitchToCU (GlobalVariable *CU);
123     void SwitchToLine (unsigned Line, bool IsInBeginFunction = false);
124
125     void PopulateDebugInfo (DIType Ty, unsigned short &TypeNo, bool &HasAux,
126                            int Aux[], std::string &TypeName);
127     void PopulateBasicTypeInfo (DIType Ty, unsigned short &TypeNo);
128     void PopulateDerivedTypeInfo (DIType Ty, unsigned short &TypeNo, 
129                                   bool &HasAux, int Aux[],
130                                   std::string &TypeName);
131
132     void PopulateCompositeTypeInfo (DIType Ty, unsigned short &TypeNo,
133                                     bool &HasAux, int Aux[],
134                                     std::string &TypeName);
135     void PopulateArrayTypeInfo (DIType Ty, unsigned short &TypeNo,
136                                 bool &HasAux, int Aux[],
137                                 std::string &TypeName);
138
139     void PopulateStructOrUnionTypeInfo (DIType Ty, unsigned short &TypeNo,
140                                         bool &HasAux, int Aux[],
141                                         std::string &TypeName);
142     void PopulateEnumTypeInfo (DIType Ty, unsigned short &TypeNo);
143
144     unsigned GetTypeDebugNumber(std::string &Type);
145     short getStorageClass(DIGlobalVariable DIGV);
146     void EmitFunctBeginDI(const Function *F);
147     void EmitCompositeTypeDecls(Module &M);
148     void EmitCompositeTypeElements (DICompositeType CTy, unsigned Suffix);
149     void EmitFunctEndDI(const Function *F, unsigned Line);
150     void EmitAuxEntry(const std::string VarName, int Aux[], 
151                       int num = PIC16Dbg::AuxSize, std::string TagName = "");
152     inline void EmitSymbol(std::string Name, short Class, 
153                            unsigned short Type = PIC16Dbg::T_NULL, 
154                            unsigned long Value = 0);
155     void EmitVarDebugInfo(Module &M);
156     void EmitEOF();
157   };
158 } // end namespace llvm;
159 #endif