summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-02-24 22:18:39 +0000
committerChris Lattner <sabre@nondot.org>2009-02-24 22:18:39 +0000
commitd7e7b8e4115d34c42b3ba479ff7615a7efbf25fc (patch)
treefe3641cd6aca04382717ef836335d30d4cb8f98c /clang/lib/CodeGen/CodeGenModule.cpp
parent9b15effcd1f3a9ea9dec0ba4a4447015196a85b3 (diff)
downloadbcm5719-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.cpp28
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);
OpenPOWER on IntegriCloud