fix some sema problems with wide strings and hook up basic codegen for them.

llvm-svn: 65582
This commit is contained in:
Chris Lattner 2009-02-26 23:01:51 +00:00
parent 26d5f05bf5
commit d42c29f9a2
6 changed files with 16 additions and 22 deletions

View File

@ -155,8 +155,13 @@ public:
bool Pascal;
const char *GetString() { return &ResultBuf[0]; }
unsigned GetStringLength() { return ResultPtr-&ResultBuf[0]; }
unsigned GetStringLength() const { return ResultPtr-&ResultBuf[0]; }
unsigned GetNumStringChars() const {
if (AnyWide)
return GetStringLength() / wchar_tByteWidth;
return GetStringLength();
}
/// getOffsetOfStringByte - This function returns the offset of the
/// specified byte of the string data represented by Token. This handles
/// advancing over escape sequences in the string.

View File

@ -1069,11 +1069,6 @@ GetAddrOfConstantCFString(const std::string &str) {
/// GetStringForStringLiteral - Return the appropriate bytes for a
/// string literal, properly padded to match the literal type.
std::string CodeGenModule::GetStringForStringLiteral(const StringLiteral *E) {
if (E->isWide()) {
ErrorUnsupported(E, "wide string");
return "FIXME";
}
const char *StrData = E->getStrData();
unsigned Len = E->getByteLength();
@ -1081,10 +1076,13 @@ std::string CodeGenModule::GetStringForStringLiteral(const StringLiteral *E) {
getContext().getAsConstantArrayType(E->getType());
assert(CAT && "String isn't pointer or array!");
// Resize the string to the right size
// FIXME: What about wchar_t strings?
// Resize the string to the right size.
std::string Str(StrData, StrData+Len);
uint64_t RealLen = CAT->getSize().getZExtValue();
if (E->isWide())
RealLen *= getContext().Target.getWCharWidth()/8;
Str.resize(RealLen, '\0');
return Str;

View File

@ -672,8 +672,7 @@ StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
// Remember if we see any wide strings.
AnyWide |= StringToks[i].is(tok::wide_string_literal);
}
// Include space for the null terminator.
++SizeBound;
@ -779,13 +778,6 @@ StringLiteralParser(const Token *StringToks, unsigned NumStringToks,
}
}
// Add zero terminator.
*ResultPtr = 0;
if (AnyWide) {
for (unsigned i = 1, e = wchar_tByteWidth; i != e; ++i)
*ResultPtr++ = 0;
}
if (Pascal) {
ResultBuf[0] = ResultPtr-&ResultBuf[0]-1;

View File

@ -400,7 +400,7 @@ Sema::ActOnStringLiteral(const Token *StringToks, unsigned NumStringToks) {
// the nul terminator character as well as the string length for pascal
// strings.
StrTy = Context.getConstantArrayType(StrTy,
llvm::APInt(32, Literal.GetStringLength()+1),
llvm::APInt(32, Literal.GetNumStringChars()+1),
ArrayType::Normal, 0);
// Pass &StringTokLocs[0], StringTokLocs.size() to factory!

View File

@ -2,4 +2,6 @@
int main() {
char a[10] = "abc";
void *foo = L"AB";
}

View File

@ -1,3 +0,0 @@
// RUN: clang -verify -emit-llvm -o - %s
void *x = L"foo"; // expected-error {{cannot compile this wide string yet}}