$ svn commit Sending source/Plugins/ExpressionParser/Clang/IRForTarget.cpp Transmitting file data .done Committing transaction... Committed revision 288403.
Sorry for the noise, folks. Sean > On Dec 1, 2016, at 11:21 AM, Sean Callanan <scalla...@apple.com> wrote: > > It'll be a fix. ETA 10 minutes. > >> On Dec 1, 2016, at 11:16 AM, Sean Callanan via lldb-commits >> <lldb-commits@lists.llvm.org <mailto:lldb-commits@lists.llvm.org>> wrote: >> >> It's definitely this one. I'll have a fix or a revert in the next 30 >> minutes. >>> On Dec 1, 2016, at 10:58 AM, Tim Hammerquist <pen...@gmail.com >>> <mailto:pen...@gmail.com>> wrote: >>> >>> Builds with this patch have been failing due to a segfaulting testcase. See: >>> >>> http://lab.llvm.org:8080/green/view/LLDB/job/lldb_build_test/22721/ >>> <http://lab.llvm.org:8080/green/view/LLDB/job/lldb_build_test/22721/> >>> http://lab.llvm.org:8080/green/view/LLDB/job/lldb_build_test/22722/ >>> <http://lab.llvm.org:8080/green/view/LLDB/job/lldb_build_test/22722/> >>> >>> At first glance, it's possible the failure was introduced by either this >>> commit (r288386) or possibly r288372. >>> >>> -Tim >>> >>> >>> On Thu, Dec 1, 2016 at 9:46 AM, Sean Callanan via lldb-commits >>> <lldb-commits@lists.llvm.org <mailto:lldb-commits@lists.llvm.org>> wrote: >>> Author: spyffe >>> Date: Thu Dec 1 11:46:51 2016 >>> New Revision: 288386 >>> >>> URL: http://llvm.org/viewvc/llvm-project?rev=288386&view=rev >>> <http://llvm.org/viewvc/llvm-project?rev=288386&view=rev> >>> Log: >>> Handle UTF-16 and UTF-32 constant CFStrings >>> >>> We have a longstanding issue where the expression parser does not handle >>> wide CFStrings (e.g., @"凸凹") correctly, producing the useless error message >>> >>> Internal error [IRForTarget]: An Objective-C constant string's string >>> initializer is not an array >>> error: warning: expression result unused >>> error: The expression could not be prepared to run in the target >>> >>> This is just a side effect of the fact that we don't handle wide string >>> constants when converting these to CFStringCreateWithBytes. That function >>> takes the string's encoding as an argument, so I made it work and added a >>> testcase. >>> >>> https://reviews.llvm.org/D27291 <https://reviews.llvm.org/D27291> >>> <rdar://problem/13190557 <rdar://problem/13190557>> >>> >>> Added: >>> lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/ >>> >>> lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/TestUnicodeString.py >>> >>> lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/main.m >>> Modified: >>> lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp >>> >>> Added: >>> lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/TestUnicodeString.py >>> URL: >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/TestUnicodeString.py?rev=288386&view=auto >>> >>> <http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/TestUnicodeString.py?rev=288386&view=auto> >>> ============================================================================== >>> --- >>> lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/TestUnicodeString.py >>> (added) >>> +++ >>> lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/TestUnicodeString.py >>> Thu Dec 1 11:46:51 2016 >>> @@ -0,0 +1,6 @@ >>> +from lldbsuite.test import lldbinline >>> +from lldbsuite.test import decorators >>> + >>> +lldbinline.MakeInlineTest( >>> + __file__, globals(), [ >>> + decorators.skipUnlessDarwin]) >>> >>> Added: >>> lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/main.m >>> URL: >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/main.m?rev=288386&view=auto >>> >>> <http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/main.m?rev=288386&view=auto> >>> ============================================================================== >>> --- >>> lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/main.m >>> (added) >>> +++ >>> lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/main.m >>> Thu Dec 1 11:46:51 2016 >>> @@ -0,0 +1,5 @@ >>> +#import <Foundation/Foundation.h> >>> + >>> +int main() { >>> + NSLog(@"凸"); //% self.expect("po @\"凹\"", >>> DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ["凹"]) >>> +} >>> >>> Modified: lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp >>> URL: >>> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp?rev=288386&r1=288385&r2=288386&view=diff >>> >>> <http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp?rev=288386&r1=288385&r2=288386&view=diff> >>> ============================================================================== >>> --- lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp >>> (original) >>> +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp Thu >>> Dec 1 11:46:51 2016 >>> @@ -498,42 +498,60 @@ bool IRForTarget::RewriteObjCConstString >>> Constant *bytes_arg = cstr ? ConstantExpr::getBitCast(cstr, i8_ptr_ty) >>> : Constant::getNullValue(i8_ptr_ty); >>> Constant *numBytes_arg = ConstantInt::get( >>> - m_intptr_ty, cstr ? string_array->getNumElements() - 1 : 0, false); >>> - Constant *encoding_arg = ConstantInt::get( >>> - i32_ty, 0x0600, false); /* 0x0600 is kCFStringEncodingASCII */ >>> - Constant *isExternal_arg = >>> - ConstantInt::get(i8_ty, 0x0, false); /* 0x0 is false */ >>> - >>> - Value *argument_array[5]; >>> - >>> - argument_array[0] = alloc_arg; >>> - argument_array[1] = bytes_arg; >>> - argument_array[2] = numBytes_arg; >>> - argument_array[3] = encoding_arg; >>> - argument_array[4] = isExternal_arg; >>> - >>> - ArrayRef<Value *> CFSCWB_arguments(argument_array, 5); >>> - >>> - FunctionValueCache CFSCWB_Caller( >>> - [this, &CFSCWB_arguments](llvm::Function *function) -> llvm::Value * >>> { >>> - return CallInst::Create( >>> - m_CFStringCreateWithBytes, CFSCWB_arguments, >>> - "CFStringCreateWithBytes", >>> - llvm::cast<Instruction>( >>> - m_entry_instruction_finder.GetValue(function))); >>> - }); >>> - >>> - if (!UnfoldConstant(ns_str, nullptr, CFSCWB_Caller, >>> - m_entry_instruction_finder, m_error_stream)) { >>> - if (log) >>> - log->PutCString( >>> - "Couldn't replace the NSString with the result of the call"); >>> - >>> - m_error_stream.Printf("error [IRForTarget internal]: Couldn't replace >>> an " >>> - "Objective-C constant string with a dynamic " >>> - "string\n"); >>> + m_intptr_ty, cstr ? (string_array->getNumElements() - 1) * >>> string_array->getElementByteSize() : 0, false); >>> + int encoding_flags = 0; >>> + switch (string_array->getElementByteSize()) { >>> + case 1: >>> + encoding_flags = 0x08000100; /* 0x08000100 is kCFStringEncodingUTF8 */ >>> + break; >>> + case 2: >>> + encoding_flags = 0x0100; /* 0x0100 is kCFStringEncodingUTF16 */ >>> + break; >>> + case 4: >>> + encoding_flags = 0x0c000100; /* 0x0c000100 is kCFStringEncodingUTF32 */ >>> + break; >>> + default: >>> + encoding_flags = 0x0600; /* fall back to 0x0600, kCFStringEncodingASCII >>> */ >>> + if (log) { >>> + log->Printf("Encountered an Objective-C constant string with unusual " >>> + "element size %llu", >>> + string_array->getElementByteSize()); >>> + } >>> + } >>> + Constant *encoding_arg = ConstantInt::get(i32_ty, encoding_flags, false); >>> + Constant *isExternal_arg = >>> + ConstantInt::get(i8_ty, 0x0, false); /* 0x0 is false */ >>> + >>> + Value *argument_array[5]; >>> + >>> + argument_array[0] = alloc_arg; >>> + argument_array[1] = bytes_arg; >>> + argument_array[2] = numBytes_arg; >>> + argument_array[3] = encoding_arg; >>> + argument_array[4] = isExternal_arg; >>> + >>> + ArrayRef<Value *> CFSCWB_arguments(argument_array, 5); >>> + >>> + FunctionValueCache CFSCWB_Caller( >>> + [this, &CFSCWB_arguments](llvm::Function *function) -> llvm::Value * { >>> + return CallInst::Create( >>> + m_CFStringCreateWithBytes, CFSCWB_arguments, >>> + "CFStringCreateWithBytes", >>> + llvm::cast<Instruction>( >>> + m_entry_instruction_finder.GetValue(function))); >>> + }); >>> + >>> + if (!UnfoldConstant(ns_str, nullptr, CFSCWB_Caller, >>> m_entry_instruction_finder, >>> + m_error_stream)) { >>> + if (log) >>> + log->PutCString( >>> + "Couldn't replace the NSString with the result of the call"); >>> + >>> + m_error_stream.Printf("error [IRForTarget internal]: Couldn't replace >>> an " >>> + "Objective-C constant string with a dynamic " >>> + "string\n"); >>> >>> - return false; >>> + return false; >>> } >>> >>> ns_str->eraseFromParent(); >>> @@ -642,31 +660,23 @@ bool IRForTarget::RewriteObjCConstString >>> return false; >>> } >>> >>> - if (nsstring_expr->getOpcode() != Instruction::GetElementPtr) { >>> - if (log) >>> - log->Printf("NSString initializer's str element is not a " >>> - "GetElementPtr expression, it's a %s", >>> - nsstring_expr->getOpcodeName()); >>> - >>> - m_error_stream.Printf("Internal error [IRForTarget]: An >>> Objective-C " >>> - "constant string's string initializer is not >>> an " >>> - "array\n"); >>> + GlobalVariable *cstr_global = nullptr; >>> >>> - return false; >>> + if (nsstring_expr->getOpcode() == Instruction::GetElementPtr) { >>> + Constant *nsstring_cstr = nsstring_expr->getOperand(0); >>> + cstr_global = dyn_cast<GlobalVariable>(nsstring_cstr); >>> + } else if (nsstring_expr->getOpcode() == Instruction::BitCast) { >>> + Constant *nsstring_cstr = nsstring_expr->getOperand(0); >>> + cstr_global = dyn_cast<GlobalVariable>(nsstring_cstr); >>> } >>> >>> - Constant *nsstring_cstr = nsstring_expr->getOperand(0); >>> - >>> - GlobalVariable *cstr_global = >>> dyn_cast<GlobalVariable>(nsstring_cstr); >>> - >>> if (!cstr_global) { >>> if (log) >>> log->PutCString( >>> "NSString initializer's str element is not a >>> GlobalVariable"); >>> >>> - m_error_stream.Printf("Internal error [IRForTarget]: An >>> Objective-C " >>> - "constant string's string initializer >>> doesn't " >>> - "point to a global\n"); >>> + m_error_stream.Printf("Internal error [IRForTarget]: Unhandled" >>> + "constant string initializer\n"); >>> >>> return false; >>> } >>> >>> >>> _______________________________________________ >>> lldb-commits mailing list >>> lldb-commits@lists.llvm.org <mailto:lldb-commits@lists.llvm.org> >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits >>> <http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits> >>> >>> >>> >>> -- >>> Tim <pen...@gmail.com <mailto:pen...@gmail.com>> >> >> _______________________________________________ >> lldb-commits mailing list >> lldb-commits@lists.llvm.org <mailto:lldb-commits@lists.llvm.org> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits >
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits