diff options
author | Chris Lattner <sabre@nondot.org> | 2009-02-24 22:18:39 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-02-24 22:18:39 +0000 |
commit | d7e7b8e4115d34c42b3ba479ff7615a7efbf25fc (patch) | |
tree | fe3641cd6aca04382717ef836335d30d4cb8f98c /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 9b15effcd1f3a9ea9dec0ba4a4447015196a85b3 (diff) | |
download | bcm5719-llvm-d7e7b8e4115d34c42b3ba479ff7615a7efbf25fc.tar.gz bcm5719-llvm-d7e7b8e4115d34c42b3ba479ff7615a7efbf25fc.zip |
first wave of fixes for @encode sema support. This is part of PR3648.
The big difference here is that (like string literal) @encode has
array type, not pointer type.
llvm-svn: 65391
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index ccba324aa02..95490df46ba 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1098,6 +1098,21 @@ CodeGenModule::GetAddrOfConstantStringFromLiteral(const StringLiteral *S) { return GetAddrOfConstantString(GetStringForStringLiteral(S)); } +/// GetAddrOfConstantStringFromObjCEncode - Return a pointer to a constant +/// array for the given ObjCEncodeExpr node. +llvm::Constant * +CodeGenModule::GetAddrOfConstantStringFromObjCEncode(const ObjCEncodeExpr *E) { + std::string Str; + getContext().getObjCEncodingForType(E->getEncodedType(), Str); + + llvm::Constant *C = llvm::ConstantArray::get(Str); + C = new llvm::GlobalVariable(C->getType(), true, + llvm::GlobalValue::InternalLinkage, + C, ".str", &getModule()); + return C; +} + + /// GenerateWritableString -- Creates storage for a string literal. static llvm::Constant *GenerateStringLiteral(const std::string &str, bool constant, @@ -1107,13 +1122,10 @@ static llvm::Constant *GenerateStringLiteral(const std::string &str, llvm::Constant *C = llvm::ConstantArray::get(str, false); // Create a global variable for this string - C = new llvm::GlobalVariable(C->getType(), constant, - llvm::GlobalValue::InternalLinkage, - C, - GlobalName ? GlobalName : ".str", - &CGM.getModule()); - - return C; + return new llvm::GlobalVariable(C->getType(), constant, + llvm::GlobalValue::InternalLinkage, + C, GlobalName ? GlobalName : ".str", + &CGM.getModule()); } /// GetAddrOfConstantString - Returns a pointer to a character array @@ -1134,7 +1146,7 @@ llvm::Constant *CodeGenModule::GetAddrOfConstantString(const std::string &str, ConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]); if (Entry.getValue()) - return Entry.getValue(); + return Entry.getValue(); // Create a global variable for this. llvm::Constant *C = GenerateStringLiteral(str, true, *this, GlobalName); |