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 }