Mercurial > projects > ldc
comparison gen/toir.cpp @ 243:4d006f7b2ada trunk
[svn r260] Changed some of the LLVMDC specific code in the Tango core and did some minor cleanups.
author | lindquist |
---|---|
date | Mon, 09 Jun 2008 03:02:14 +0200 |
parents | 0db62b770a49 |
children | a95056b3c996 |
comparison
equal
deleted
inserted
replaced
242:ab43d1e1bf2a | 243:4d006f7b2ada |
---|---|
1197 | 1197 |
1198 if (fnarg && fnarg->llvmByVal) | 1198 if (fnarg && fnarg->llvmByVal) |
1199 palist = palist.addAttr(j+1, llvm::ParamAttr::ByVal); | 1199 palist = palist.addAttr(j+1, llvm::ParamAttr::ByVal); |
1200 | 1200 |
1201 // this hack is necessary :/ | 1201 // this hack is necessary :/ |
1202 // thing is DMD doesn't create correct signatures for the DMD generated calls to the runtime. | |
1203 // only the return type is right, no arguments (parameters==NULL) ... | |
1202 if (dfn && dfn->func && dfn->func->runTimeHack) { | 1204 if (dfn && dfn->func && dfn->func->runTimeHack) { |
1203 llvm::Function* fn = dfn->func->ir.irFunc->func; | 1205 llvm::Function* fn = dfn->func->ir.irFunc->func; |
1204 assert(fn); | 1206 assert(fn); |
1205 if (fn->getParamAttrs().paramHasAttr(j+1, llvm::ParamAttr::ByVal)) | 1207 if (fn->getParamAttrs().paramHasAttr(j+1, llvm::ParamAttr::ByVal)) |
1206 palist = palist.addAttr(j+1, llvm::ParamAttr::ByVal); | 1208 palist = palist.addAttr(j+1, llvm::ParamAttr::ByVal); |
1300 { | 1302 { |
1301 Logger::print("SymOffExp::toElem: %s | %s\n", toChars(), type->toChars()); | 1303 Logger::print("SymOffExp::toElem: %s | %s\n", toChars(), type->toChars()); |
1302 LOG_SCOPE; | 1304 LOG_SCOPE; |
1303 | 1305 |
1304 assert(0 && "SymOffExp::toElem should no longer be called :/"); | 1306 assert(0 && "SymOffExp::toElem should no longer be called :/"); |
1305 | |
1306 if (VarDeclaration* vd = var->isVarDeclaration()) | |
1307 { | |
1308 Logger::println("VarDeclaration"); | |
1309 | |
1310 // handle forward reference | |
1311 if (!vd->ir.declared && vd->isDataseg()) { | |
1312 vd->toObjFile(); // TODO | |
1313 } | |
1314 | |
1315 assert(vd->ir.getIrValue()); | |
1316 Type* t = DtoDType(type); | |
1317 Type* tnext = DtoDType(t->next); | |
1318 Type* vdtype = DtoDType(vd->type); | |
1319 | |
1320 LLValue* llvalue = vd->nestedref ? DtoNestedVariable(vd) : vd->ir.getIrValue(); | |
1321 LLValue* varmem = 0; | |
1322 | |
1323 if (vdtype->ty == Tstruct && !(t->ty == Tpointer && t->next == vdtype)) { | |
1324 Logger::println("struct"); | |
1325 TypeStruct* vdt = (TypeStruct*)vdtype; | |
1326 assert(vdt->sym); | |
1327 | |
1328 const LLType* llt = DtoType(t); | |
1329 if (offset == 0) { | |
1330 varmem = p->ir->CreateBitCast(llvalue, llt, "tmp"); | |
1331 } | |
1332 else { | |
1333 DStructIndexVector dst; | |
1334 varmem = DtoIndexStruct(llvalue,vdt->sym, tnext, offset, dst); | |
1335 } | |
1336 } | |
1337 else if (vdtype->ty == Tsarray) { | |
1338 Logger::println("sarray"); | |
1339 | |
1340 assert(llvalue); | |
1341 //e->arg = llvalue; // TODO | |
1342 | |
1343 const LLType* llt = DtoType(t); | |
1344 LLValue* off = 0; | |
1345 if (offset != 0) { | |
1346 Logger::println("offset = %d\n", offset); | |
1347 } | |
1348 if (offset == 0) { | |
1349 varmem = llvalue; | |
1350 } | |
1351 else { | |
1352 const LLType* elemtype = llvalue->getType()->getContainedType(0)->getContainedType(0); | |
1353 size_t elemsz = getABITypeSize(elemtype); | |
1354 varmem = DtoGEPi(llvalue, 0, offset / elemsz, "tmp"); | |
1355 } | |
1356 } | |
1357 else if (offset == 0) { | |
1358 Logger::println("normal symoff"); | |
1359 | |
1360 assert(llvalue); | |
1361 varmem = llvalue; | |
1362 | |
1363 const LLType* llt = DtoType(t); | |
1364 if (llvalue->getType() != llt) { | |
1365 varmem = p->ir->CreateBitCast(varmem, llt, "tmp"); | |
1366 } | |
1367 } | |
1368 else { | |
1369 assert(0); | |
1370 } | |
1371 return new DFieldValue(type, varmem, true); | |
1372 } | |
1373 | |
1374 assert(0); | |
1375 return 0; | 1307 return 0; |
1376 } | 1308 } |
1377 | 1309 |
1378 ////////////////////////////////////////////////////////////////////////////////////////// | 1310 ////////////////////////////////////////////////////////////////////////////////////////// |
1379 | 1311 |
1457 | 1389 |
1458 LLValue* src = l->getRVal(); | 1390 LLValue* src = l->getRVal(); |
1459 | 1391 |
1460 DStructIndexVector vdoffsets; | 1392 DStructIndexVector vdoffsets; |
1461 arrptr = DtoIndexClass(src, tc->sym, vd->type, vd->offset, vdoffsets); | 1393 arrptr = DtoIndexClass(src, tc->sym, vd->type, vd->offset, vdoffsets); |
1462 | |
1463 /*std::vector<unsigned> vdoffsets(1,0); | |
1464 tc->sym->offsetToIndex(vd->type, vd->offset, vdoffsets); | |
1465 | |
1466 LLValue* src = l->getRVal(); | |
1467 | |
1468 Logger::println("indices:"); | |
1469 for (size_t i=0; i<vdoffsets.size(); ++i) | |
1470 Logger::println("%d", vdoffsets[i]); | |
1471 | |
1472 Logger::cout() << "src: " << *src << '\n'; | |
1473 arrptr = DtoGEP(src,vdoffsets,"tmp",p->scopebb()); | |
1474 Logger::cout() << "dst: " << *arrptr << '\n';*/ | |
1475 } | 1394 } |
1476 else | 1395 else |
1477 assert(0); | 1396 assert(0); |
1478 | 1397 |
1479 //Logger::cout() << "mem: " << *arrptr << '\n'; | 1398 //Logger::cout() << "mem: " << *arrptr << '\n'; |
1515 funcval = new llvm::LoadInst(funcval,"tmp",p->scopebb()); | 1434 funcval = new llvm::LoadInst(funcval,"tmp",p->scopebb()); |
1516 #if OPAQUE_VTBLS | 1435 #if OPAQUE_VTBLS |
1517 funcval = DtoBitCast(funcval, getPtrToType(DtoType(fdecl->type))); | 1436 funcval = DtoBitCast(funcval, getPtrToType(DtoType(fdecl->type))); |
1518 Logger::cout() << "funcval casted: " << *funcval << '\n'; | 1437 Logger::cout() << "funcval casted: " << *funcval << '\n'; |
1519 #endif | 1438 #endif |
1520 //assert(funcval->getType() == DtoType(fdecl->type)); | |
1521 //cc = DtoCallingConv(fdecl->linkage); | |
1522 } | 1439 } |
1523 // static call | 1440 // static call |
1524 else { | 1441 else { |
1525 DtoForceDeclareDsymbol(fdecl); | 1442 DtoForceDeclareDsymbol(fdecl); |
1526 funcval = fdecl->ir.irFunc->func; | 1443 funcval = fdecl->ir.irFunc->func; |
3151 return 0; | 3068 return 0; |
3152 } | 3069 } |
3153 | 3070 |
3154 void obj_includelib(char*){} | 3071 void obj_includelib(char*){} |
3155 | 3072 |
3156 /* this has moved to asmstmt.cpp | |
3157 AsmStatement::AsmStatement(Loc loc, Token *tokens) : | |
3158 Statement(loc) | |
3159 { | |
3160 this->tokens = tokens; | |
3161 } | |
3162 Statement *AsmStatement::syntaxCopy() | |
3163 { | |
3164 //error("%s: inline asm is not yet implemented", loc.toChars()); | |
3165 //fatal(); | |
3166 //assert(0); | |
3167 return 0; | |
3168 } | |
3169 | |
3170 Statement *AsmStatement::semantic(Scope *sc) | |
3171 { | |
3172 return Statement::semantic(sc); | |
3173 } | |
3174 | |
3175 | |
3176 void AsmStatement::toCBuffer(OutBuffer *buf, HdrGenState *hgs) | |
3177 { | |
3178 Statement::toCBuffer(buf, hgs); | |
3179 } | |
3180 | |
3181 int AsmStatement::comeFrom() | |
3182 { | |
3183 //error("%s: inline asm is not yet implemented", loc.toChars()); | |
3184 //fatal(); | |
3185 //assert(0); | |
3186 return 0; | |
3187 } | |
3188 */ | |
3189 | |
3190 void | 3073 void |
3191 backend_init() | 3074 backend_init() |
3192 { | 3075 { |
3193 // now lazily loaded | 3076 // now lazily loaded |
3194 //LLVM_D_InitRuntime(); | 3077 //LLVM_D_InitRuntime(); |