void IrGenForwardDeclarator::visit(AstDataDef& dataDef) { AstDefaultIterator::visit(dataDef); if ( dataDef.storageDuration() == StorageDuration::eStatic ) { const auto addr = new GlobalVariable(m_module, dataDef.objType().llvmType(), !(dataDef.objType().qualifiers() & ObjType::eMutable), GlobalValue::InternalLinkage, nullptr, dataDef.fqName()); dataDef.setAddrOfIrObject(addr); } }
void IrGen::visit(AstDataDef& dataDef) { // note that AstDataDef being function parameters are _not_ handled here but // in visit of AstFunDef // determine initializer object const auto initObj_ = [&]() { const auto ctorArgs = dataDef.ctorArgs().childs(); // currently a data object must be initialized withe exactly one // initializer assert(ctorArgs.size() == 1); return callAcceptOn(*ctorArgs.front()); }; const auto initObj = dataDef.doNotInit() ? UndefValue::get(dataDef.objType().llvmType()) : initObj_(); assert(initObj); // allocate, if not allready done, and initialize. if (dataDef.storageDuration() == StorageDuration::eStatic) { dataDef.ir().initializeIrObject(initObj, m_builder); } else if (dataDef.storageDuration() == StorageDuration::eLocal) { allocateAndInitLocalIrObjectFor(dataDef, initObj, dataDef.name()); } }