Beispiel #1
0
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);
  }
}
Beispiel #2
0
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());
  }
}