diff options
-rw-r--r-- | lldb/source/Expression/IRForTarget.cpp | 29 | ||||
-rw-r--r-- | lldb/test/foundation/const-strings.m | 23 |
2 files changed, 45 insertions, 7 deletions
diff --git a/lldb/source/Expression/IRForTarget.cpp b/lldb/source/Expression/IRForTarget.cpp index 4601a3f4138..f9ea7e1ab38 100644 --- a/lldb/source/Expression/IRForTarget.cpp +++ b/lldb/source/Expression/IRForTarget.cpp @@ -478,13 +478,18 @@ IRForTarget::RewriteObjCConstString (llvm::Module &llvm_module, m_CFStringCreateWithBytes = ConstantExpr::getIntToPtr(CFSCWB_addr_int, CFSCWB_ptr_ty); } - ConstantArray *string_array = dyn_cast<ConstantArray>(cstr->getInitializer()); + ConstantArray *string_array; + + if (cstr) + string_array = dyn_cast<ConstantArray>(cstr->getInitializer()); + else + string_array = NULL; SmallVector <Value*, 5> CFSCWB_arguments; Constant *alloc_arg = Constant::getNullValue(i8_ptr_ty); - Constant *bytes_arg = ConstantExpr::getBitCast(cstr, i8_ptr_ty); - Constant *numBytes_arg = ConstantInt::get(intptr_ty, string_array->getType()->getNumElements(), false); + Constant *bytes_arg = cstr ? ConstantExpr::getBitCast(cstr, i8_ptr_ty) : Constant::getNullValue(i8_ptr_ty); + Constant *numBytes_arg = ConstantInt::get(intptr_ty, cstr ? string_array->getType()->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 */ @@ -664,9 +669,8 @@ IRForTarget::RewriteObjCConstStrings(Module &llvm_module, Function &llvm_functio return false; } - - ConstantArray *cstr_array = dyn_cast<ConstantArray>(cstr_global->getInitializer()); - + + /* if (!cstr_array) { if (log) @@ -688,9 +692,20 @@ IRForTarget::RewriteObjCConstStrings(Module &llvm_module, Function &llvm_functio return false; } + */ + + ConstantArray *cstr_array = dyn_cast<ConstantArray>(cstr_global->getInitializer()); if (log) - log->Printf("Found NSString constant %s, which contains \"%s\"", vi->first(), cstr_array->getAsString().c_str()); + { + if (cstr_array) + log->Printf("Found NSString constant %s, which contains \"%s\"", vi->first(), cstr_array->getAsString().c_str()); + else + log->Printf("Found NSString constant %s, which contains \"\"", vi->first()); + } + + if (!cstr_array) + cstr_global = NULL; if (!RewriteObjCConstString(llvm_module, nsstring_global, cstr_global, FirstEntryInstruction)) { diff --git a/lldb/test/foundation/const-strings.m b/lldb/test/foundation/const-strings.m new file mode 100644 index 00000000000..07c408a84a4 --- /dev/null +++ b/lldb/test/foundation/const-strings.m @@ -0,0 +1,23 @@ +#import <Foundation/Foundation.h> + +// Tests to run: + +// Breakpoint 1 +// -- +// (lldb) expr (int)[str compare:@"hello"] +// (int) $0 = 0 +// (lldb) expr (int)[str compare:@"world"] +// (int) $1 = -1 +// (lldb) expr (int)[@"" length] +// (int) $2 = 0 + +int main () +{ + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + NSString *str = [NSString stringWithCString:"hello" encoding:NSASCIIStringEncoding]; + + NSLog(@"String \"%@\" has length %d", str, [str length]); // Breakpoint 1 + + [pool drain]; +} |