[PATCH] D45418: [SimplifyLibcalls] Atoi, strtol replacements
Eli Friedman via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 9 12:55:45 PDT 2018
efriedma added inline comments.
================
Comment at: lib/Transforms/Utils/SimplifyLibCalls.cpp:1697
+ if (ConstantInt *CInt = dyn_cast<ConstantInt>(CI->getArgOperand(2)))
+ return ConstantInt::get(CI->getType(), strtol(Str.str().c_str(), nullptr,
+ CInt->getSExtValue()));
----------------
lebedev.ri wrote:
> lebedev.ri wrote:
> > `base` is `i32`, but `strtol` returns `long int` (`i64`?), so i don't think using `CI->getType()` is correct.
> >
> Oh, `CI` is `CallInst`, not `ConstantInt`, never mind then.
This is missing some checks. In particular, what happens if the host's "long" is a different width from the target's "long"? What happens if strtol sets errno? What happens if the target program is using a locale where isspace() doesn't match the C locale's isspace()?
================
Comment at: lib/Transforms/Utils/SimplifyLibCalls.cpp:1685
+
+ return ConstantInt::get(CI->getType(), atoi(Str.str().c_str()));
+}
----------------
I'm worried about host behavior leaking through here; specifically, the "undefined" values for overflow might vary. Could you use some function with more predictable behavior here? (Maybe something based on llvm::consumeSignedInteger()?)
https://reviews.llvm.org/D45418
More information about the llvm-commits
mailing list