<div dir="ltr">Thanks, Sean!</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Dec 1, 2016 at 11:25 AM, Sean Callanan <span dir="ltr"><<a href="mailto:scallanan@apple.com" target="_blank">scallanan@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div>$ svn commit</div><div>Sending        source/Plugins/<wbr>ExpressionParser/Clang/<wbr>IRForTarget.cpp</div><div>Transmitting file data .done</div><div>Committing transaction...</div><div>Committed revision 288403.</div><div><br></div><div>Sorry for the noise, folks.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>Sean</div></font></span><div><div class="h5"><div><br></div><div><blockquote type="cite"><div>On Dec 1, 2016, at 11:21 AM, Sean Callanan <<a href="mailto:scallanan@apple.com" target="_blank">scallanan@apple.com</a>> wrote:</div><br class="m_-3190629545780702821Apple-interchange-newline"><div><div style="word-wrap:break-word">It'll be a fix.  ETA 10 minutes.<div><br><div><div><blockquote type="cite"><div>On Dec 1, 2016, at 11:16 AM, Sean Callanan via lldb-commits <<a href="mailto:lldb-commits@lists.llvm.org" target="_blank">lldb-commits@lists.llvm.org</a>> wrote:</div><br class="m_-3190629545780702821Apple-interchange-newline"><div><div style="word-wrap:break-word">It's definitely this one.  I'll have a fix or a revert in the next 30 minutes.<br><div><blockquote type="cite"><div>On Dec 1, 2016, at 10:58 AM, Tim Hammerquist <<a href="mailto:penryu@gmail.com" target="_blank">penryu@gmail.com</a>> wrote:</div><br class="m_-3190629545780702821Apple-interchange-newline"><div><div dir="ltr">Builds with this patch have been failing due to a segfaulting testcase. See:<div><br></div><div><a href="http://lab.llvm.org:8080/green/view/LLDB/job/lldb_build_test/22721/" target="_blank">http://lab.llvm.org:8080/<wbr>green/view/LLDB/job/lldb_<wbr>build_test/22721/</a><br></div><div><a href="http://lab.llvm.org:8080/green/view/LLDB/job/lldb_build_test/22722/" target="_blank">http://lab.llvm.org:8080/<wbr>green/view/LLDB/job/lldb_<wbr>build_test/22722/</a><br></div><div><br></div><div>At first glance, it's possible the failure was introduced by either this commit (r288386) or possibly r288372.</div><div><br></div><div>-Tim</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Dec 1, 2016 at 9:46 AM, Sean Callanan via lldb-commits <span dir="ltr"><<a href="mailto:lldb-commits@lists.llvm.org" target="_blank">lldb-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: spyffe<br>
Date: Thu Dec  1 11:46:51 2016<br>
New Revision: 288386<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=288386&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=288386&view=rev</a><br>
Log:<br>
Handle UTF-16 and UTF-32 constant CFStrings<br>
<br>
We have a longstanding issue where the expression parser does not handle wide CFStrings (e.g., @"凸凹") correctly, producing the useless error message<br>
<br>
Internal error [IRForTarget]: An Objective-C constant string's string initializer is not an array<br>
error: warning: expression result unused<br>
error: The expression could not be prepared to run in the target<br>
<br>
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.<br>
<br>
<a href="https://reviews.llvm.org/D27291" rel="noreferrer" target="_blank">https://reviews.llvm.org/D2729<wbr>1</a><br>
<<a>rdar://problem/13190557</a>><br>
<br>
Added:<br>
    lldb/trunk/packages/Python/lld<wbr>bsuite/test/lang/objc/unicode-<wbr>string/<br>
    lldb/trunk/packages/Python/lld<wbr>bsuite/test/lang/objc/unicode-<wbr>string/TestUnicodeString.py<br>
    lldb/trunk/packages/Python/lld<wbr>bsuite/test/lang/objc/unicode-<wbr>string/main.m<br>
Modified:<br>
    lldb/trunk/source/Plugins/Expr<wbr>essionParser/Clang/IRForTarget<wbr>.cpp<br>
<br>
Added: lldb/trunk/packages/Python/lld<wbr>bsuite/test/lang/objc/unicode-<wbr>string/TestUnicodeString.py<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/TestUnicodeString.py?rev=288386&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/lldb/trunk/packages/Pyth<wbr>on/lldbsuite/test/lang/objc/<wbr>unicode-string/TestUnicodeStri<wbr>ng.py?rev=288386&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lldb/trunk/packages/Python/lld<wbr>bsuite/test/lang/objc/unicode-<wbr>string/TestUnicodeString.py (added)<br>
+++ lldb/trunk/packages/Python/lld<wbr>bsuite/test/lang/objc/unicode-<wbr>string/TestUnicodeString.py Thu Dec  1 11:46:51 2016<br>
@@ -0,0 +1,6 @@<br>
+from lldbsuite.test import lldbinline<br>
+from lldbsuite.test import decorators<br>
+<br>
+lldbinline.MakeInlineTest(<br>
+    __file__, globals(), [<br>
+        decorators.skipUnlessDarwin])<br>
<br>
Added: lldb/trunk/packages/Python/lld<wbr>bsuite/test/lang/objc/unicode-<wbr>string/main.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/lang/objc/unicode-string/main.m?rev=288386&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/lldb/trunk/packages/Pyth<wbr>on/lldbsuite/test/lang/objc/<wbr>unicode-string/main.m?rev=<wbr>288386&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lldb/trunk/packages/Python/lld<wbr>bsuite/test/lang/objc/unicode-<wbr>string/main.m (added)<br>
+++ lldb/trunk/packages/Python/lld<wbr>bsuite/test/lang/objc/unicode-<wbr>string/main.m Thu Dec  1 11:46:51 2016<br>
@@ -0,0 +1,5 @@<br>
+#import <Foundation/Foundation.h><br>
+<br>
+int main() {<br>
+  NSLog(@"凸"); //% self.expect("po @\"凹\"", DATA_TYPES_DISPLAYED_CORRECTLY<wbr>, substrs = ["凹"])<br>
+}<br>
<br>
Modified: lldb/trunk/source/Plugins/Expr<wbr>essionParser/Clang/IRForTarget<wbr>.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/IRForTarget.cpp?rev=288386&r1=288385&r2=288386&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/lldb/trunk/source/Plugin<wbr>s/ExpressionParser/Clang/<wbr>IRForTarget.cpp?rev=288386&r1=<wbr>288385&r2=288386&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lldb/trunk/source/Plugins/Expr<wbr>essionParser/Clang/IRForTarget<wbr>.cpp (original)<br>
+++ lldb/trunk/source/Plugins/Expr<wbr>essionParser/Clang/IRForTarget<wbr>.cpp Thu Dec  1 11:46:51 2016<br>
@@ -498,42 +498,60 @@ bool IRForTarget::RewriteObjCConstS<wbr>tring<br>
   Constant *bytes_arg = cstr ? ConstantExpr::getBitCast(cstr, i8_ptr_ty)<br>
                              : Constant::getNullValue(i8_ptr_<wbr>ty);<br>
   Constant *numBytes_arg = ConstantInt::get(<br>
-      m_intptr_ty, cstr ? string_array->getNumElements() - 1 : 0, false);<br>
-  Constant *encoding_arg = ConstantInt::get(<br>
-      i32_ty, 0x0600, false); /* 0x0600 is kCFStringEncodingASCII */<br>
-  Constant *isExternal_arg =<br>
-      ConstantInt::get(i8_ty, 0x0, false); /* 0x0 is false */<br>
-<br>
-  Value *argument_array[5];<br>
-<br>
-  argument_array[0] = alloc_arg;<br>
-  argument_array[1] = bytes_arg;<br>
-  argument_array[2] = numBytes_arg;<br>
-  argument_array[3] = encoding_arg;<br>
-  argument_array[4] = isExternal_arg;<br>
-<br>
-  ArrayRef<Value *> CFSCWB_arguments(argument_arra<wbr>y, 5);<br>
-<br>
-  FunctionValueCache CFSCWB_Caller(<br>
-      [this, &CFSCWB_arguments](llvm::Funct<wbr>ion *function) -> llvm::Value * {<br>
-        return CallInst::Create(<br>
-            m_CFStringCreateWithBytes, CFSCWB_arguments,<br>
-            "CFStringCreateWithBytes",<br>
-            llvm::cast<Instruction>(<br>
-                m_entry_instruction_finder.Get<wbr>Value(function)));<br>
-      });<br>
-<br>
-  if (!UnfoldConstant(ns_str, nullptr, CFSCWB_Caller,<br>
-                      m_entry_instruction_finder, m_error_stream)) {<br>
-    if (log)<br>
-      log->PutCString(<br>
-          "Couldn't replace the NSString with the result of the call");<br>
-<br>
-    m_error_stream.Printf("error [IRForTarget internal]: Couldn't replace an "<br>
-                          "Objective-C constant string with a dynamic "<br>
-                          "string\n");<br>
+      m_intptr_ty, cstr ? (string_array->getNumElements(<wbr>) - 1) * string_array->getElementByteSi<wbr>ze() : 0, false);<br>
+ int encoding_flags = 0;<br>
+ switch (string_array->getElementByteS<wbr>ize()) {<br>
+ case 1:<br>
+   encoding_flags = 0x08000100; /* 0x08000100 is kCFStringEncodingUTF8 */<br>
+   break;<br>
+ case 2:<br>
+   encoding_flags = 0x0100; /* 0x0100 is kCFStringEncodingUTF16 */<br>
+   break;<br>
+ case 4:<br>
+   encoding_flags = 0x0c000100; /* 0x0c000100 is kCFStringEncodingUTF32 */<br>
+   break;<br>
+ default:<br>
+   encoding_flags = 0x0600; /* fall back to 0x0600, kCFStringEncodingASCII */<br>
+   if (log) {<br>
+     log->Printf("Encountered an Objective-C constant string with unusual "<br>
+                 "element size %llu",<br>
+                 string_array->getElementByteS<wbr>ize());<br>
+   }<br>
+ }<br>
+ Constant *encoding_arg = ConstantInt::get(i32_ty, encoding_flags, false);<br>
+ Constant *isExternal_arg =<br>
+     ConstantInt::get(i8_ty, 0x0, false); /* 0x0 is false */<br>
+<br>
+ Value *argument_array[5];<br>
+<br>
+ argument_array[0] = alloc_arg;<br>
+ argument_array[1] = bytes_arg;<br>
+ argument_array[2] = numBytes_arg;<br>
+ argument_array[3] = encoding_arg;<br>
+ argument_array[4] = isExternal_arg;<br>
+<br>
+ ArrayRef<Value *> CFSCWB_arguments(argument_arra<wbr>y, 5);<br>
+<br>
+ FunctionValueCache CFSCWB_Caller(<br>
+     [this, &CFSCWB_arguments](llvm::Funct<wbr>ion *function) -> llvm::Value * {<br>
+       return CallInst::Create(<br>
+           m_CFStringCreateWithBytes, CFSCWB_arguments,<br>
+           "CFStringCreateWithBytes",<br>
+           llvm::cast<Instruction>(<br>
+               m_entry_instruction_finder.Ge<wbr>tValue(function)));<br>
+     });<br>
+<br>
+ if (!UnfoldConstant(ns_str, nullptr, CFSCWB_Caller, m_entry_instruction_finder,<br>
+                     m_error_stream)) {<br>
+   if (log)<br>
+     log->PutCString(<br>
+         "Couldn't replace the NSString with the result of the call");<br>
+<br>
+   m_error_stream.Printf("error [IRForTarget internal]: Couldn't replace an "<br>
+                         "Objective-C constant string with a dynamic "<br>
+                         "string\n");<br>
<br>
-    return false;<br>
+   return false;<br>
   }<br>
<br>
   ns_str->eraseFromParent();<br>
@@ -642,31 +660,23 @@ bool IRForTarget::RewriteObjCConstS<wbr>tring<br>
         return false;<br>
       }<br>
<br>
-      if (nsstring_expr->getOpcode() != Instruction::GetElementPtr) {<br>
-        if (log)<br>
-          log->Printf("NSString initializer's str element is not a "<br>
-                      "GetElementPtr expression, it's a %s",<br>
-                      nsstring_expr->getOpcodeName()<wbr>);<br>
-<br>
-        m_error_stream.Printf("Interna<wbr>l error [IRForTarget]: An Objective-C "<br>
-                              "constant string's string initializer is not an "<br>
-                              "array\n");<br>
+      GlobalVariable *cstr_global = nullptr;<br>
<br>
-        return false;<br>
+      if (nsstring_expr->getOpcode() == Instruction::GetElementPtr) {<br>
+        Constant *nsstring_cstr = nsstring_expr->getOperand(0);<br>
+        cstr_global = dyn_cast<GlobalVariable>(nsstr<wbr>ing_cstr);<br>
+      } else if (nsstring_expr->getOpcode() == Instruction::BitCast) {<br>
+        Constant *nsstring_cstr = nsstring_expr->getOperand(0);<br>
+        cstr_global = dyn_cast<GlobalVariable>(nsstr<wbr>ing_cstr);<br>
       }<br>
<br>
-      Constant *nsstring_cstr = nsstring_expr->getOperand(0);<br>
-<br>
-      GlobalVariable *cstr_global = dyn_cast<GlobalVariable>(nsstr<wbr>ing_cstr);<br>
-<br>
       if (!cstr_global) {<br>
         if (log)<br>
           log->PutCString(<br>
               "NSString initializer's str element is not a GlobalVariable");<br>
<br>
-        m_error_stream.Printf("Interna<wbr>l error [IRForTarget]: An Objective-C "<br>
-                              "constant string's string initializer doesn't "<br>
-                              "point to a global\n");<br>
+        m_error_stream.Printf("Interna<wbr>l error [IRForTarget]: Unhandled"<br>
+                              "constant string initializer\n");<br>
<br>
         return false;<br>
       }<br>
<br>
<br>
______________________________<wbr>_________________<br>
lldb-commits mailing list<br>
<a href="mailto:lldb-commits@lists.llvm.org" target="_blank">lldb-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/lldb-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="m_-3190629545780702821gmail_signature" data-smartmail="gmail_signature">Tim <<a href="mailto:penryu@gmail.com" target="_blank">penryu@gmail.com</a>></div>
</div>
</div></blockquote></div><br></div>______________________________<wbr>_________________<br>lldb-commits mailing list<br><a href="mailto:lldb-commits@lists.llvm.org" target="_blank">lldb-commits@lists.llvm.org</a><br><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/lldb-commits</a><br></div></blockquote></div><br></div></div></div></div></blockquote></div><br></div></div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Tim <<a href="mailto:penryu@gmail.com" target="_blank">penryu@gmail.com</a>></div>
</div>