Mercurial > projects > ldc
comparison gen/todebug.cpp @ 94:61615fa85940 trunk
[svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca").
Added support for array .sort and .reverse properties.
Fixed some bugs with pointer arithmetic.
Disabled some DMD AST optimizations that was messing things up, destroying valuable information.
Added a KDevelop project file, this is what I use for coding LLVMDC now :)
Other minor stuff.
author | lindquist |
---|---|
date | Mon, 12 Nov 2007 06:32:46 +0100 |
parents | fd32135dca3e |
children | ce7ed8f59b99 |
comparison
equal
deleted
inserted
replaced
93:08508eebbb3e | 94:61615fa85940 |
---|---|
54 %llvm.dbg.global_variables = linkonce constant %llvm.dbg.anchor.type { uint 0, uint 52 } ;; DW_TAG_variable | 54 %llvm.dbg.global_variables = linkonce constant %llvm.dbg.anchor.type { uint 0, uint 52 } ;; DW_TAG_variable |
55 %llvm.dbg.subprograms = linkonce constant %llvm.dbg.anchor.type { uint 0, uint 46 } ;; DW_TAG_subprogram | 55 %llvm.dbg.subprograms = linkonce constant %llvm.dbg.anchor.type { uint 0, uint 46 } ;; DW_TAG_subprogram |
56 */ | 56 */ |
57 if (!gIR->module->getNamedGlobal("llvm.dbg.compile_units")) { | 57 if (!gIR->module->getNamedGlobal("llvm.dbg.compile_units")) { |
58 std::vector<llvm::Constant*> vals; | 58 std::vector<llvm::Constant*> vals; |
59 vals.push_back(DtoConstUint(0)); | 59 vals.push_back(DtoConstUint(llvm::LLVMDebugVersion)); |
60 vals.push_back(DtoConstUint(DW_TAG_compile_unit)); | 60 vals.push_back(DtoConstUint(DW_TAG_compile_unit)); |
61 llvm::Constant* i = llvm::ConstantStruct::get(t, vals); | 61 llvm::Constant* i = llvm::ConstantStruct::get(t, vals); |
62 dbg_compile_units = new llvm::GlobalVariable(t,true,llvm::GlobalValue::LinkOnceLinkage,i,"llvm.dbg.compile_units",gIR->module); | 62 dbg_compile_units = new llvm::GlobalVariable(t,true,llvm::GlobalValue::LinkOnceLinkage,i,"llvm.dbg.compile_units",gIR->module); |
63 dbg_compile_units->setSection("llvm.metadata"); | 63 dbg_compile_units->setSection("llvm.metadata"); |
64 } | 64 } |
65 if (!gIR->module->getNamedGlobal("llvm.dbg.global_variables")) { | 65 if (!gIR->module->getNamedGlobal("llvm.dbg.global_variables")) { |
66 std::vector<llvm::Constant*> vals; | 66 std::vector<llvm::Constant*> vals; |
67 vals.push_back(DtoConstUint(0)); | 67 vals.push_back(DtoConstUint(llvm::LLVMDebugVersion)); |
68 vals.push_back(DtoConstUint(DW_TAG_variable)); | 68 vals.push_back(DtoConstUint(DW_TAG_variable)); |
69 llvm::Constant* i = llvm::ConstantStruct::get(t, vals); | 69 llvm::Constant* i = llvm::ConstantStruct::get(t, vals); |
70 dbg_global_variables = new llvm::GlobalVariable(t,true,llvm::GlobalValue::LinkOnceLinkage,i,"llvm.dbg.global_variables",gIR->module); | 70 dbg_global_variables = new llvm::GlobalVariable(t,true,llvm::GlobalValue::LinkOnceLinkage,i,"llvm.dbg.global_variables",gIR->module); |
71 dbg_global_variables->setSection("llvm.metadata"); | 71 dbg_global_variables->setSection("llvm.metadata"); |
72 } | 72 } |
73 if (!gIR->module->getNamedGlobal("llvm.dbg.subprograms")) { | 73 if (!gIR->module->getNamedGlobal("llvm.dbg.subprograms")) { |
74 std::vector<llvm::Constant*> vals; | 74 std::vector<llvm::Constant*> vals; |
75 vals.push_back(DtoConstUint(0)); | 75 vals.push_back(DtoConstUint(llvm::LLVMDebugVersion)); |
76 vals.push_back(DtoConstUint(DW_TAG_subprogram)); | 76 vals.push_back(DtoConstUint(DW_TAG_subprogram)); |
77 llvm::Constant* i = llvm::ConstantStruct::get(t, vals); | 77 llvm::Constant* i = llvm::ConstantStruct::get(t, vals); |
78 dbg_subprograms = new llvm::GlobalVariable(t,true,llvm::GlobalValue::LinkOnceLinkage,i,"llvm.dbg.subprograms",gIR->module); | 78 dbg_subprograms = new llvm::GlobalVariable(t,true,llvm::GlobalValue::LinkOnceLinkage,i,"llvm.dbg.subprograms",gIR->module); |
79 dbg_subprograms->setSection("llvm.metadata"); | 79 dbg_subprograms->setSection("llvm.metadata"); |
80 } | 80 } |
108 return llvm::cast<llvm::StructType>(gIR->module->getTypeByName("llvm.dbg.subprogram.type")); | 108 return llvm::cast<llvm::StructType>(gIR->module->getTypeByName("llvm.dbg.subprogram.type")); |
109 } | 109 } |
110 | 110 |
111 ////////////////////////////////////////////////////////////////////////////////////////////////// | 111 ////////////////////////////////////////////////////////////////////////////////////////////////// |
112 | 112 |
113 llvm::GlobalVariable* DtoDwarfCompileUnit(Module* m) | 113 llvm::GlobalVariable* DtoDwarfCompileUnit(Module* m, bool define) |
114 { | 114 { |
115 std::vector<llvm::Constant*> vals; | 115 llvm::Constant* c = NULL; |
116 vals.push_back(llvm::ConstantExpr::getAdd( | 116 if (1 || define) { |
117 DtoConstUint(DW_TAG_compile_unit), | 117 std::vector<llvm::Constant*> vals; |
118 DtoConstUint(llvm::LLVMDebugVersion))); | 118 vals.push_back(llvm::ConstantExpr::getAdd( |
119 vals.push_back(dbgToArrTy(GetDwarfAnchor(DW_TAG_compile_unit))); | 119 DtoConstUint(DW_TAG_compile_unit), |
120 DtoConstUint(llvm::LLVMDebugVersion))); | |
121 vals.push_back(dbgToArrTy(GetDwarfAnchor(DW_TAG_compile_unit))); | |
120 | 122 |
121 vals.push_back(DtoConstUint(DW_LANG_D)); | 123 vals.push_back(DtoConstUint(DW_LANG_D)); |
122 vals.push_back(DtoConstStringPtr(m->srcfile->name->toChars(), "llvm.metadata")); | 124 vals.push_back(DtoConstStringPtr(m->srcfile->name->toChars(), "llvm.metadata")); |
123 std::string srcpath(FileName::path(m->srcfile->name->toChars())); | 125 std::string srcpath(FileName::path(m->srcfile->name->toChars())); |
124 srcpath.append("/"); | 126 srcpath.append("/"); |
125 vals.push_back(DtoConstStringPtr(srcpath.c_str(), "llvm.metadata")); | 127 vals.push_back(DtoConstStringPtr(srcpath.c_str(), "llvm.metadata")); |
126 vals.push_back(DtoConstStringPtr("LLVMDC (http://www.dsource.org/projects/llvmdc)", "llvm.metadata")); | 128 vals.push_back(DtoConstStringPtr("LLVMDC (http://www.dsource.org/projects/llvmdc)", "llvm.metadata")); |
127 | 129 |
128 llvm::Constant* c = llvm::ConstantStruct::get(GetDwarfCompileUnitType(), vals); | 130 c = llvm::ConstantStruct::get(GetDwarfCompileUnitType(), vals); |
129 llvm::GlobalVariable* gv = new llvm::GlobalVariable(c->getType(), true, llvm::GlobalValue::InternalLinkage, c, "llvm.dbg.compile_unit", gIR->module); | 131 } |
132 llvm::GlobalVariable* gv = new llvm::GlobalVariable(GetDwarfCompileUnitType(), true, llvm::GlobalValue::InternalLinkage, c, "llvm.dbg.compile_unit", gIR->module); | |
130 gv->setSection("llvm.metadata"); | 133 gv->setSection("llvm.metadata"); |
131 return gv; | 134 return gv; |
132 } | 135 } |
133 | 136 |
134 ////////////////////////////////////////////////////////////////////////////////////////////////// | 137 ////////////////////////////////////////////////////////////////////////////////////////////////// |
135 | 138 |
136 llvm::GlobalVariable* DtoDwarfSubProgram(FuncDeclaration* fd) | 139 llvm::GlobalVariable* DtoDwarfSubProgram(FuncDeclaration* fd, llvm::GlobalVariable* compileUnit) |
137 { | 140 { |
138 std::vector<llvm::Constant*> vals; | 141 std::vector<llvm::Constant*> vals; |
139 vals.push_back(llvm::ConstantExpr::getAdd( | 142 vals.push_back(llvm::ConstantExpr::getAdd( |
140 DtoConstUint(DW_TAG_subprogram), | 143 DtoConstUint(DW_TAG_subprogram), |
141 DtoConstUint(llvm::LLVMDebugVersion))); | 144 DtoConstUint(llvm::LLVMDebugVersion))); |
142 vals.push_back(dbgToArrTy(GetDwarfAnchor(DW_TAG_subprogram))); | 145 vals.push_back(dbgToArrTy(GetDwarfAnchor(DW_TAG_subprogram))); |
143 | 146 |
144 vals.push_back(dbgToArrTy(gIR->dwarfCompileUnit)); | 147 vals.push_back(dbgToArrTy(compileUnit)); |
145 vals.push_back(DtoConstStringPtr(fd->toPrettyChars(), "llvm.metadata")); | 148 vals.push_back(DtoConstStringPtr(fd->toPrettyChars(), "llvm.metadata")); |
149 vals.push_back(vals.back()); | |
146 vals.push_back(DtoConstStringPtr(fd->mangle(), "llvm.metadata")); | 150 vals.push_back(DtoConstStringPtr(fd->mangle(), "llvm.metadata")); |
147 vals.push_back(llvm::ConstantPointerNull::get(llvm::PointerType::get(llvm::Type::Int8Ty))); | 151 vals.push_back(dbgToArrTy(compileUnit)); |
148 vals.push_back(dbgToArrTy(gIR->dwarfCompileUnit)); | |
149 vals.push_back(DtoConstUint(fd->loc.linnum)); | 152 vals.push_back(DtoConstUint(fd->loc.linnum)); |
150 vals.push_back(llvm::ConstantPointerNull::get(dbgArrTy())); | 153 vals.push_back(llvm::ConstantPointerNull::get(dbgArrTy())); |
151 vals.push_back(DtoConstBool(fd->protection == PROTprivate)); | 154 vals.push_back(DtoConstBool(fd->protection == PROTprivate)); |
152 vals.push_back(DtoConstBool(fd->getModule() == gIR->dmodule)); | 155 vals.push_back(DtoConstBool(fd->getModule() == gIR->dmodule)); |
153 | 156 |
176 void DtoDwarfStopPoint(unsigned ln) | 179 void DtoDwarfStopPoint(unsigned ln) |
177 { | 180 { |
178 std::vector<llvm::Value*> args; | 181 std::vector<llvm::Value*> args; |
179 args.push_back(DtoConstUint(ln)); | 182 args.push_back(DtoConstUint(ln)); |
180 args.push_back(DtoConstUint(0)); | 183 args.push_back(DtoConstUint(0)); |
181 args.push_back(dbgToArrTy(gIR->dwarfCompileUnit)); | 184 assert(gIR->dmodule->llvmCompileUnit); |
185 args.push_back(dbgToArrTy(gIR->dmodule->llvmCompileUnit)); | |
182 gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.stoppoint"), args.begin(), args.end()); | 186 gIR->ir->CreateCall(gIR->module->getFunction("llvm.dbg.stoppoint"), args.begin(), args.end()); |
183 } | 187 } |