void codegenStmt(Expr* stmt) { GenInfo* info = gGenInfo; FILE* outfile = info->cfile; info->lineno = stmt->linenum(); info->filename = stmt->fname(); if( outfile ) { if (printCppLineno && stmt->linenum() > 0) info->cStatements.push_back(zlineToString(stmt)); if (fGenIDS) info->cStatements.push_back(idCommentTemp(stmt)); } else { #ifdef HAVE_LLVM if (debug_info && stmt->linenum() > 0) { // Adjust the current line number, but leave the scope alone. llvm::MDNode* scope; if(stmt->parentSymbol && stmt->parentSymbol->astTag == E_FnSymbol) { scope = debug_info->get_function((FnSymbol *)stmt->parentSymbol); } else { scope = info->builder->getCurrentDebugLocation().getScope( #if HAVE_LLVM_VER < 37 info->llvmContext #endif ); } info->builder->SetCurrentDebugLocation( llvm::DebugLoc::get(stmt->linenum(),0 /*col*/,scope)); } #endif } ++gStmtCount; }
void VarSymbol::codegenDefC(bool global, bool isHeader) { GenInfo* info = gGenInfo; if (this->hasFlag(FLAG_EXTERN)) return; if (type == dtVoid) return; AggregateType* ct = toAggregateType(type); QualifiedType qt = qualType(); if (qt.isRef() && !qt.isRefType()) { Type* refType = getOrMakeRefTypeDuringCodegen(type); ct = toAggregateType(refType); } if (qt.isWideRef() && !qt.isWideRefType()) { Type* refType = getOrMakeRefTypeDuringCodegen(type); Type* wideType = getOrMakeWideTypeDuringCodegen(refType); ct = toAggregateType(wideType); } Type* useType = type; if (ct) useType = ct; std::string typestr = (this->hasFlag(FLAG_SUPER_CLASS) ? std::string(toAggregateType(useType)->classStructName(true)) : useType->codegen().c); // // a variable can be codegen'd as static if it is global and neither // exported nor external. // std::string str; if(fIncrementalCompilation) { bool addExtern = global && isHeader; str = (addExtern ? "extern " : "") + typestr + " " + cname; } else { bool isStatic = global && !hasFlag(FLAG_EXPORT) && !hasFlag(FLAG_EXTERN); str = (isStatic ? "static " : "") + typestr + " " + cname; } if (ct) { if (ct->isClass()) { if (isFnSymbol(defPoint->parentSymbol)) { str += " = NULL"; } } else if (ct->symbol->hasFlag(FLAG_WIDE_REF) || ct->symbol->hasFlag(FLAG_WIDE_CLASS)) { if (isFnSymbol(defPoint->parentSymbol)) { if (widePointersStruct) { // // CHPL_LOCALEID_T_INIT is #defined in the chpl-locale-model.h // file in the runtime, for the selected locale model. // str += " = {CHPL_LOCALEID_T_INIT, NULL}"; } else { str += " = ((wide_ptr_t) NULL)"; } } } } if (fGenIDS) str = idCommentTemp(this) + str; if (printCppLineno && !isHeader && !isTypeSymbol(defPoint->parentSymbol)) str = zlineToString(this) + str; info->cLocalDecls.push_back(str); }