mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-02 15:26:29 +00:00
Some "prep" work for handling ObjC @-string constants that contain UTF-8. No functionality change.
Changed GenerateConstantString() to take an ObjCStringLiteral (instead of a std::string). While this isn't strictly necessary, it seems cleaner and allows us to cache to "containsNonAscii" if necessary (to avoid checking in both Sema and CodeGen). llvm-svn: 68114
This commit is contained in:
parent
d51f196ff5
commit
66afeb5968
@ -533,7 +533,12 @@ public:
|
||||
const char *getStrData() const { return StrData; }
|
||||
unsigned getByteLength() const { return ByteLength; }
|
||||
bool isWide() const { return IsWide; }
|
||||
|
||||
bool containsNonAscii() const {
|
||||
for (unsigned i = 0; i < getByteLength(); ++i)
|
||||
if (!isascii(getStrData()[i]))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
/// getNumConcatenated - Get the number of string literal tokens that were
|
||||
/// concatenated in translation phase #6 to form this string literal.
|
||||
unsigned getNumConcatenated() const { return NumConcatenated; }
|
||||
|
@ -417,9 +417,7 @@ public:
|
||||
return CGM.GetAddrOfConstantStringFromObjCEncode(cast<ObjCEncodeExpr>(E));
|
||||
case Expr::ObjCStringLiteralClass: {
|
||||
ObjCStringLiteral* SL = cast<ObjCStringLiteral>(E);
|
||||
std::string S(SL->getString()->getStrData(),
|
||||
SL->getString()->getByteLength());
|
||||
llvm::Constant *C = CGM.getObjCRuntime().GenerateConstantString(S);
|
||||
llvm::Constant *C = CGM.getObjCRuntime().GenerateConstantString(SL);
|
||||
return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType()));
|
||||
}
|
||||
case Expr::PredefinedExprClass: {
|
||||
@ -445,6 +443,7 @@ public:
|
||||
const Expr *Arg = CE->getArg(0)->IgnoreParenCasts();
|
||||
const StringLiteral *Literal = cast<StringLiteral>(Arg);
|
||||
std::string S(Literal->getStrData(), Literal->getByteLength());
|
||||
// FIXME: need to deal with UCN conversion issues.
|
||||
return CGM.GetAddrOfConstantCFString(S);
|
||||
}
|
||||
case Expr::BlockExprClass: {
|
||||
|
@ -26,9 +26,7 @@ using namespace CodeGen;
|
||||
/// Emits an instance of NSConstantString representing the object.
|
||||
llvm::Value *CodeGenFunction::EmitObjCStringLiteral(const ObjCStringLiteral *E)
|
||||
{
|
||||
std::string String(E->getString()->getStrData(),
|
||||
E->getString()->getByteLength());
|
||||
llvm::Constant *C = CGM.getObjCRuntime().GenerateConstantString(String);
|
||||
llvm::Constant *C = CGM.getObjCRuntime().GenerateConstantString(E);
|
||||
// FIXME: This bitcast should just be made an invariant on the Runtime.
|
||||
return llvm::ConstantExpr::getBitCast(C, ConvertType(E->getType()));
|
||||
}
|
||||
|
@ -94,7 +94,7 @@ private:
|
||||
std::vector<llvm::Constant*> &V, const std::string &Name="");
|
||||
public:
|
||||
CGObjCGNU(CodeGen::CodeGenModule &cgm);
|
||||
virtual llvm::Constant *GenerateConstantString(const std::string &String);
|
||||
virtual llvm::Constant *GenerateConstantString(const ObjCStringLiteral *);
|
||||
virtual CodeGen::RValue
|
||||
GenerateMessageSend(CodeGen::CodeGenFunction &CGF,
|
||||
QualType ResultType,
|
||||
@ -252,7 +252,9 @@ llvm::Constant *CGObjCGNU::MakeGlobal(const llvm::ArrayType *Ty,
|
||||
//TODO: In case there are any crazy people still using the GNU runtime without
|
||||
//an OpenStep implementation, this should let them select their own class for
|
||||
//constant strings.
|
||||
llvm::Constant *CGObjCGNU::GenerateConstantString(const std::string &Str) {
|
||||
llvm::Constant *CGObjCGNU::GenerateConstantString(const ObjCStringLiteral *SL) {
|
||||
std::string Str(SL->getString()->getStrData(),
|
||||
SL->getString()->getByteLength());
|
||||
std::vector<llvm::Constant*> Ivars;
|
||||
Ivars.push_back(NULLPtr);
|
||||
Ivars.push_back(MakeConstantString(Str));
|
||||
|
@ -487,7 +487,7 @@ public:
|
||||
CGObjCCommonMac(CodeGen::CodeGenModule &cgm) : CGM(cgm)
|
||||
{ }
|
||||
|
||||
virtual llvm::Constant *GenerateConstantString(const std::string &String);
|
||||
virtual llvm::Constant *GenerateConstantString(const ObjCStringLiteral *SL);
|
||||
|
||||
virtual llvm::Function *GenerateMethod(const ObjCMethodDecl *OMD,
|
||||
const ObjCContainerDecl *CD=0);
|
||||
@ -899,8 +899,13 @@ llvm::Value *CGObjCMac::GetSelector(CGBuilderTy &Builder, Selector Sel) {
|
||||
*/
|
||||
|
||||
llvm::Constant *CGObjCCommonMac::GenerateConstantString(
|
||||
const std::string &String) {
|
||||
return CGM.GetAddrOfConstantCFString(String);
|
||||
const ObjCStringLiteral *SL) {
|
||||
std::string Str(SL->getString()->getStrData(),
|
||||
SL->getString()->getByteLength());
|
||||
if (SL->getString()->containsNonAscii()) {
|
||||
// FIXME: Convert from UTF-8 to UTF-16.
|
||||
}
|
||||
return CGM.GetAddrOfConstantCFString(Str);
|
||||
}
|
||||
|
||||
/// Generates a message send where the super is the receiver. This is
|
||||
|
@ -48,6 +48,7 @@ namespace CodeGen {
|
||||
class ObjCProtocolDecl;
|
||||
class Selector;
|
||||
class ObjCIvarDecl;
|
||||
class ObjCStringLiteral;
|
||||
|
||||
namespace CodeGen {
|
||||
class CodeGenModule;
|
||||
@ -72,7 +73,7 @@ public:
|
||||
Selector Sel) = 0;
|
||||
|
||||
/// Generate a constant string object.
|
||||
virtual llvm::Constant *GenerateConstantString(const std::string &String) = 0;
|
||||
virtual llvm::Constant *GenerateConstantString(const ObjCStringLiteral *) = 0;
|
||||
|
||||
/// Generate a category. A category contains a list of methods (and
|
||||
/// accompanying metadata) and a list of protocols.
|
||||
|
Loading…
x
Reference in New Issue
Block a user