void RuntimeDebugBuilder::createFlush(PollyIRBuilder &Builder) { Module *M = Builder.GetInsertBlock()->getParent()->getParent(); const char *Name = "fflush"; Function *F = M->getFunction(Name); if (!F) { GlobalValue::LinkageTypes Linkage = Function::ExternalLinkage; FunctionType *Ty = FunctionType::get(Builder.getInt32Ty(), Builder.getInt8PtrTy(), false); F = Function::Create(Ty, Linkage, Name, M); } // fflush(NULL) flushes _all_ open output streams. // // fflush is declared as 'int fflush(FILE *stream)'. As we only pass on a NULL // pointer, the type we point to does conceptually not matter. However, if // fflush is already declared in this translation unit, we use the very same // type to ensure that LLVM does not complain about mismatching types. Builder.CreateCall(F, Constant::getNullValue(F->arg_begin()->getType())); }