mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
PR10210: New method ConstantArray::getAsCString(). Use it in LTO to
avoid getting embedded trailing null bytes in std::strings. llvm-svn: 133999
This commit is contained in:
parent
48f76db97a
commit
fa97b8b8fa
@ -387,6 +387,12 @@ public:
|
||||
///
|
||||
std::string getAsString() const;
|
||||
|
||||
/// getAsCString - If this array is isCString(), then this method converts the
|
||||
/// array (without the trailing null byte) to an std::string and returns it.
|
||||
/// Otherwise, it asserts out.
|
||||
///
|
||||
std::string getAsCString() const;
|
||||
|
||||
/// isNullValue - Return true if this is the value that would be returned by
|
||||
/// getNullValue. This always returns false because zero arrays are always
|
||||
/// created as ConstantAggregateZero objects.
|
||||
|
@ -1011,17 +1011,32 @@ bool ConstantArray::isCString() const {
|
||||
}
|
||||
|
||||
|
||||
/// getAsString - If the sub-element type of this array is i8
|
||||
/// then this method converts the array to an std::string and returns it.
|
||||
/// Otherwise, it asserts out.
|
||||
/// convertToString - Helper function for getAsString() and getAsCString().
|
||||
static std::string convertToString(const User *U, unsigned len)
|
||||
{
|
||||
std::string Result;
|
||||
Result.reserve(len);
|
||||
for (unsigned i = 0; i != len; ++i)
|
||||
Result.push_back((char)cast<ConstantInt>(U->getOperand(i))->getZExtValue());
|
||||
return Result;
|
||||
}
|
||||
|
||||
/// getAsString - If this array is isString(), then this method converts the
|
||||
/// array to an std::string and returns it. Otherwise, it asserts out.
|
||||
///
|
||||
std::string ConstantArray::getAsString() const {
|
||||
assert(isString() && "Not a string!");
|
||||
std::string Result;
|
||||
Result.reserve(getNumOperands());
|
||||
for (unsigned i = 0, e = getNumOperands(); i != e; ++i)
|
||||
Result.push_back((char)cast<ConstantInt>(getOperand(i))->getZExtValue());
|
||||
return Result;
|
||||
return convertToString(this, getNumOperands());
|
||||
}
|
||||
|
||||
|
||||
/// getAsCString - If this array is isCString(), then this method converts the
|
||||
/// array (without the trailing null byte) to an std::string and returns it.
|
||||
/// Otherwise, it asserts out.
|
||||
///
|
||||
std::string ConstantArray::getAsCString() const {
|
||||
assert(isCString() && "Not a string!");
|
||||
return convertToString(this, getNumOperands() - 1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -191,7 +191,7 @@ bool LTOModule::objcClassNameFromExpression(Constant *c, std::string &name) {
|
||||
Constant *cn = gvn->getInitializer();
|
||||
if (ConstantArray *ca = dyn_cast<ConstantArray>(cn)) {
|
||||
if (ca->isCString()) {
|
||||
name = ".objc_class_name_" + ca->getAsString();
|
||||
name = ".objc_class_name_" + ca->getAsCString();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user