/// Emit a call to the puts function. This assumes that Str is some pointer.
Value *emitPutS(Value *Str, IRBuilderBase &B, const TargetLibraryInfo *TLI);
- /// Emit a call to the fputc function. This assumes that Char can be casted to
- /// int (currently assuming int is i32), and File is a pointer to FILE.
+ /// Emit a call to the fputc function. This assumes that Char is an 'int', and
+ /// File is a pointer to FILE.
Value *emitFPutC(Value *Char, Value *File, IRBuilderBase &B,
const TargetLibraryInfo *TLI);
IntTy, File->getType());
if (File->getType()->isPointerTy())
inferNonMandatoryLibFuncAttrs(M, FPutcName, *TLI);
- Char = B.CreateIntCast(Char, IntTy, /*isSigned*/true,
- "chari");
CallInst *CI = B.CreateCall(F, {Char, File}, FPutcName);
if (const Function *Fn =
// Decode the second character of the format string.
if (FormatStr[1] == 'c') {
- // fprintf(F, "%c", chr) --> fputc(chr, F)
+ // fprintf(F, "%c", chr) --> fputc((int)chr, F)
if (!CI->getArgOperand(2)->getType()->isIntegerTy())
return nullptr;
- return copyFlags(
- *CI, emitFPutC(CI->getArgOperand(2), CI->getArgOperand(0), B, TLI));
+ Type *IntTy = B.getIntNTy(TLI->getIntSize());
+ Value *V = B.CreateIntCast(CI->getArgOperand(2), IntTy, /*isSigned*/ true,
+ "chari");
+ return copyFlags(*CI, emitFPutC(V, CI->getArgOperand(0), B, TLI));
}
if (FormatStr[1] == 's') {
if (Bytes == 1 && CI->use_empty()) { // fwrite(S,1,1,F) -> fputc(S[0],F)
Value *Char = B.CreateLoad(B.getInt8Ty(),
castToCStr(CI->getArgOperand(0), B), "char");
- Value *NewCI = emitFPutC(Char, CI->getArgOperand(3), B, TLI);
+ Type *IntTy = B.getIntNTy(TLI->getIntSize());
+ Value *Cast = B.CreateIntCast(Char, IntTy, /*isSigned*/ true, "chari");
+ Value *NewCI = emitFPutC(Cast, CI->getArgOperand(3), B, TLI);
return NewCI ? ConstantInt::get(CI->getType(), 1) : nullptr;
}
}