aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorSteve Naroff <snaroff@apple.com>2009-04-01 15:50:34 +0000
committerSteve Naroff <snaroff@apple.com>2009-04-01 15:50:34 +0000
commite9b7d8ace8674585818990cff585daae7745bd88 (patch)
tree0dc91aba12b897e59f83e5e7295a889e69082bf8 /lib/CodeGen/CodeGenModule.cpp
parent969c689d893a248eca4f049f5b89f747e66e4bff (diff)
Add ConvertUTF module from http://www.unicode.org/Public/PROGRAMS/CVTUTF.
#ifdef'd out the 5 conversion routines that we don't currently need. Still need a bit more work in GetAddrOfConstantCFString(). Added a FIXME to indicate this. Expect to remove the FIXME today... git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68208 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--lib/CodeGen/CodeGenModule.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index d428c836af..2e84c6049d 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -24,6 +24,7 @@
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetInfo.h"
+#include "clang/Basic/ConvertUTF.h"
#include "llvm/CallingConv.h"
#include "llvm/Module.h"
#include "llvm/Intrinsics.h"
@@ -1003,9 +1004,21 @@ static void appendFieldAndPadding(CodeGenModule &CGM,
// See: <rdr://2996215>
llvm::Constant *CodeGenModule::
GetAddrOfConstantCFString(const StringLiteral *Literal) {
- // if (Literal->containsNonAsciiOrNull()) {
- // // FIXME: Convert from UTF-8 to UTF-16.
- // }
+ bool isUTF16 = false;
+ if (Literal->containsNonAsciiOrNull()) {
+ // Convert from UTF-8 to UTF-16.
+ llvm::SmallVector<UTF16, 128> ToBuf(Literal->getByteLength());
+ const UTF8 *FromPtr = (UTF8 *)Literal->getStrData();
+ UTF16 *ToPtr = &ToBuf[0];
+
+ ConversionResult Result;
+ Result = ConvertUTF8toUTF16(&FromPtr, FromPtr+Literal->getByteLength(),
+ &ToPtr, ToPtr+Literal->getByteLength(),
+ strictConversion);
+ assert(Result == conversionOK && "UTF-8 to UTF-16 conversion failed");
+ isUTF16 = true;
+ // FIXME: Do something with the converted value!
+ }
std::string str(Literal->getStrData(), Literal->getByteLength());
llvm::StringMapEntry<llvm::Constant *> &Entry =
CFConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]);
@@ -1056,7 +1069,9 @@ GetAddrOfConstantCFString(const StringLiteral *Literal) {
NextField = *Field++;
const llvm::Type *Ty = getTypes().ConvertType(getContext().UnsignedIntTy);
appendFieldAndPadding(*this, Fields, CurField, NextField,
- llvm::ConstantInt::get(Ty, 0x07C8), CFRD, STy);
+ isUTF16 ? llvm::ConstantInt::get(Ty, 0x07d0)
+ : llvm::ConstantInt::get(Ty, 0x07C8),
+ CFRD, STy);
// String pointer.
CurField = NextField;