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();