aboutsummaryrefslogtreecommitdiff
path: root/packages/Python/lldbsuite/test/lang
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2016-01-06 20:12:03 +0000
committerDimitry Andric <dim@FreeBSD.org>2016-01-06 20:12:03 +0000
commit9e6d35490a6542f9c97607f93c2ef8ca8e03cbcc (patch)
treedd2a1ddf0476664c2b823409c36cbccd52662ca7 /packages/Python/lldbsuite/test/lang
parent3bd2e91faeb9eeec1aae82c64a3253afff551cfd (diff)
downloadsrc-9e6d35490a6542f9c97607f93c2ef8ca8e03cbcc.tar.gz
src-9e6d35490a6542f9c97607f93c2ef8ca8e03cbcc.zip
Vendor import of lldb trunk r256945:vendor/lldb/lldb-trunk-r256945
Notes
Notes: svn path=/vendor/lldb/dist/; revision=293262 svn path=/vendor/lldb/lldb-trunk-r256945/; revision=293263; tag=vendor/lldb/lldb-trunk-r256945
Diffstat (limited to 'packages/Python/lldbsuite/test/lang')
-rw-r--r--packages/Python/lldbsuite/test/lang/c/anonymous/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/anonymous/TestAnonymous.py147
-rw-r--r--packages/Python/lldbsuite/test/lang/c/anonymous/main.c82
-rw-r--r--packages/Python/lldbsuite/test/lang/c/array_types/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/array_types/TestArrayTypes.py198
-rw-r--r--packages/Python/lldbsuite/test/lang/c/array_types/cmds.txt3
-rw-r--r--packages/Python/lldbsuite/test/lang/c/array_types/main.c51
-rw-r--r--packages/Python/lldbsuite/test/lang/c/bitfields/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/bitfields/TestBitfields.py162
-rw-r--r--packages/Python/lldbsuite/test/lang/c/bitfields/main.c67
-rw-r--r--packages/Python/lldbsuite/test/lang/c/blocks/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/c/blocks/TestBlocks.py61
-rw-r--r--packages/Python/lldbsuite/test/lang/c/blocks/main.c21
-rw-r--r--packages/Python/lldbsuite/test/lang/c/const_variables/Makefile7
-rw-r--r--packages/Python/lldbsuite/test/lang/c/const_variables/TestConstVariables.py64
-rw-r--r--packages/Python/lldbsuite/test/lang/c/const_variables/functions.c18
-rw-r--r--packages/Python/lldbsuite/test/lang/c/const_variables/main.c23
-rw-r--r--packages/Python/lldbsuite/test/lang/c/enum_types/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/enum_types/TestEnumTypes.py71
-rw-r--r--packages/Python/lldbsuite/test/lang/c/enum_types/main.c29
-rw-r--r--packages/Python/lldbsuite/test/lang/c/forward/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/forward/README.txt5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/forward/TestForwardDeclaration.py47
-rw-r--r--packages/Python/lldbsuite/test/lang/c/forward/foo.c8
-rw-r--r--packages/Python/lldbsuite/test/lang/c/forward/foo.h4
-rw-r--r--packages/Python/lldbsuite/test/lang/c/forward/main.c18
-rw-r--r--packages/Python/lldbsuite/test/lang/c/function_types/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/function_types/TestFunctionTypes.py76
-rw-r--r--packages/Python/lldbsuite/test/lang/c/function_types/main.c22
-rw-r--r--packages/Python/lldbsuite/test/lang/c/global_variables/Makefile8
-rw-r--r--packages/Python/lldbsuite/test/lang/c/global_variables/TestGlobalVariables.py76
-rw-r--r--packages/Python/lldbsuite/test/lang/c/global_variables/a.c15
-rw-r--r--packages/Python/lldbsuite/test/lang/c/global_variables/cmds.txt3
-rw-r--r--packages/Python/lldbsuite/test/lang/c/global_variables/main.c24
-rw-r--r--packages/Python/lldbsuite/test/lang/c/inlines/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/inlines/inlines.c53
-rw-r--r--packages/Python/lldbsuite/test/lang/c/inlines/inlines.h4
-rw-r--r--packages/Python/lldbsuite/test/lang/c/modules/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/modules/TestCModules.py65
-rw-r--r--packages/Python/lldbsuite/test/lang/c/modules/main.c20
-rw-r--r--packages/Python/lldbsuite/test/lang/c/recurse/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/recurse/main.c28
-rw-r--r--packages/Python/lldbsuite/test/lang/c/register_variables/Makefile7
-rw-r--r--packages/Python/lldbsuite/test/lang/c/register_variables/TestRegisterVariables.py70
-rw-r--r--packages/Python/lldbsuite/test/lang/c/register_variables/test.c27
-rw-r--r--packages/Python/lldbsuite/test/lang/c/set_values/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/set_values/TestSetValues.py111
-rw-r--r--packages/Python/lldbsuite/test/lang/c/set_values/main.c116
-rw-r--r--packages/Python/lldbsuite/test/lang/c/shared_lib/Makefile8
-rw-r--r--packages/Python/lldbsuite/test/lang/c/shared_lib/TestSharedLib.py71
-rw-r--r--packages/Python/lldbsuite/test/lang/c/shared_lib/foo.c22
-rw-r--r--packages/Python/lldbsuite/test/lang/c/shared_lib/foo.h10
-rw-r--r--packages/Python/lldbsuite/test/lang/c/shared_lib/main.c13
-rw-r--r--packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/Makefile10
-rw-r--r--packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/TestSharedLibStrippedSymbols.py73
-rw-r--r--packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/foo.c22
-rw-r--r--packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/foo.h12
-rw-r--r--packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/main.c13
-rw-r--r--packages/Python/lldbsuite/test/lang/c/stepping/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/stepping/TestStepAndBreakpoints.py242
-rw-r--r--packages/Python/lldbsuite/test/lang/c/stepping/TestThreadStepping.py81
-rw-r--r--packages/Python/lldbsuite/test/lang/c/stepping/main.c69
-rw-r--r--packages/Python/lldbsuite/test/lang/c/strings/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/strings/TestCStrings.py54
-rw-r--r--packages/Python/lldbsuite/test/lang/c/strings/main.c18
-rw-r--r--packages/Python/lldbsuite/test/lang/c/struct_types/Makefile3
-rw-r--r--packages/Python/lldbsuite/test/lang/c/struct_types/TestStructTypes.py4
-rw-r--r--packages/Python/lldbsuite/test/lang/c/struct_types/main.c43
-rw-r--r--packages/Python/lldbsuite/test/lang/c/tls_globals/Makefile11
-rw-r--r--packages/Python/lldbsuite/test/lang/c/tls_globals/TestTlsGlobals.py75
-rw-r--r--packages/Python/lldbsuite/test/lang/c/tls_globals/a.c18
-rw-r--r--packages/Python/lldbsuite/test/lang/c/tls_globals/main.c36
-rw-r--r--packages/Python/lldbsuite/test/lang/c/typedef/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/c/typedef/Testtypedef.py40
-rw-r--r--packages/Python/lldbsuite/test/lang/c/typedef/main.c46
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/auto/Makefile7
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/auto/TestCPPAuto.py25
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/auto/main.cpp16
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/bool/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/bool/TestCPPBool.py26
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/bool/main.cpp17
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/TestCPPBreakpointCommands.py84
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/nested.cpp76
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/call-function/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/call-function/TestCallCPPFunction.py33
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/call-function/main.cpp11
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/chained-calls/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/chained-calls/TestCppChainedCalls.py73
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/chained-calls/main.cpp33
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/char1632_t/.categories1
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/char1632_t/Makefile8
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/char1632_t/TestChar1632T.py90
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/char1632_t/main.cpp44
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/class_static/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/class_static/TestStaticVariables.py120
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/class_static/main.cpp53
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/class_types/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/class_types/TestClassTypes.py215
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/class_types/TestClassTypesDisassembly.py94
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/class_types/cmds.txt3
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/class_types/main.cpp126
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/diamond/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/diamond/TestDiamond.py41
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/diamond/main.cpp85
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/dynamic-value/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/dynamic-value/TestCppValueCast.py129
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/dynamic-value/TestDynamicValue.py223
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/dynamic-value/pass-to-base.cpp69
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/dynamic-value/sbvalue-cast.cpp80
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/enum_types/Makefile10
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/enum_types/TestCPP11EnumTypes.py110
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/enum_types/main.cpp33
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/exceptions/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/exceptions/TestCPPExceptionBreakpoints.py65
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/exceptions/exceptions.cpp42
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/TestFrameVariableAnonymousUnions.py27
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/main.cpp23
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/global_operators/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/global_operators/TestCppGlobalOperators.py54
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/global_operators/main.cpp16
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/incomplete-types/Makefile35
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py66
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/incomplete-types/a.cpp10
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/incomplete-types/a.h11
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/incomplete-types/length.cpp8
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/incomplete-types/length.h8
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/incomplete-types/main.cpp18
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/Makefile7
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/TestWithLimitDebugInfo.py48
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/base.cpp6
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/base.h10
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/derived.cpp6
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/derived.h13
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/main.cpp7
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/namespace/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespace.py125
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespaceLookup.py223
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/namespace/cmds.txt3
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/namespace/main.cpp124
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/namespace/ns.cpp32
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/namespace/ns.h36
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/namespace/ns2.cpp65
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/namespace/ns3.cpp27
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/nsimport/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/nsimport/TestCppNsImport.py101
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/nsimport/main.cpp72
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/TestOverloadedFunctions.py36
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/main.cpp43
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/static-a.cpp9
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/static-b.cpp9
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/rdar12991846/Makefile8
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/rdar12991846/TestRdar12991846.py85
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/rdar12991846/main.cpp21
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/rvalue-references/Makefile7
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/rvalue-references/TestRvalueReferences.py49
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/rvalue-references/main.cpp12
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/scope/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/scope/TestCppScope.py67
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/scope/main.cpp25
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/signed_types/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/signed_types/TestSignedTypes.py60
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/signed_types/main.cpp33
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/static_members/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/static_members/TestCPPStaticMembers.py59
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/static_members/main.cpp36
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/static_methods/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/static_methods/TestCPPStaticMethods.py36
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/static_methods/main.cpp38
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/stl/Makefile15
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/stl/TestSTL.py118
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/stl/TestStdCXXDisassembly.py111
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/stl/cmds.txt3
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/stl/main.cpp30
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/this/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/this/TestCPPThis.py53
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/this/main.cpp53
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/unique-types/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/unique-types/TestUniqueTypes.py62
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/unique-types/main.cpp24
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/unsigned_types/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/unsigned_types/TestUnsignedTypes.py54
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/unsigned_types/main.cpp22
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/virtual/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/virtual/TestVirtual.py90
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/virtual/main.cpp113
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/wchar_t/.categories1
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/wchar_t/Makefile8
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/wchar_t/TestCxxWCharT.py74
-rw-r--r--packages/Python/lldbsuite/test/lang/cpp/wchar_t/main.cpp35
-rw-r--r--packages/Python/lldbsuite/test/lang/go/expressions/TestExpressions.py113
-rw-r--r--packages/Python/lldbsuite/test/lang/go/expressions/main.go21
-rw-r--r--packages/Python/lldbsuite/test/lang/go/formatters/TestGoFormatters.py65
-rw-r--r--packages/Python/lldbsuite/test/lang/go/formatters/main.go9
-rw-r--r--packages/Python/lldbsuite/test/lang/go/goroutines/TestGoroutines.py85
-rw-r--r--packages/Python/lldbsuite/test/lang/go/goroutines/main.go89
-rw-r--r--packages/Python/lldbsuite/test/lang/go/runtime/TestGoLanguageRuntime80
-rw-r--r--packages/Python/lldbsuite/test/lang/go/runtime/main.go38
-rw-r--r--packages/Python/lldbsuite/test/lang/go/types/TestGoASTContext.py133
-rw-r--r--packages/Python/lldbsuite/test/lang/go/types/main.go47
-rw-r--r--packages/Python/lldbsuite/test/lang/mixed/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/mixed/TestMixedLanguages.py56
-rw-r--r--packages/Python/lldbsuite/test/lang/mixed/foo.cpp11
-rw-r--r--packages/Python/lldbsuite/test/lang/mixed/main.c15
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/.categories1
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/blocks/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/blocks/TestObjCIvarsInBlocks.py103
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/blocks/ivars-in-blocks.h11
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/blocks/ivars-in-blocks.m57
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/blocks/main.m10
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/forward-decl/Container.h13
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/forward-decl/Container.m27
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/forward-decl/Makefile9
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/forward-decl/TestForwardDecl.py54
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/forward-decl/main.m14
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/Makefile8
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/TestConstStrings.py53
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/TestFoundationDisassembly.py134
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods.py262
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods2.py169
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/TestObjectDescriptionAPI.py71
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/TestRuntimeTypes.py48
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/TestSymbolTable.py68
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/const-strings.m24
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/main.m141
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/my-base.h8
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/foundation/my-base.m10
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/hidden-ivars/InternalDefiner.h11
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/hidden-ivars/InternalDefiner.m31
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/hidden-ivars/Makefile9
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/hidden-ivars/TestHiddenIvars.py174
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/hidden-ivars/main.m54
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/ivar-IMP/Makefile12
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/ivar-IMP/TestObjCiVarIMP.py63
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/ivar-IMP/myclass.h6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/ivar-IMP/myclass.m16
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/ivar-IMP/repro.m7
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-auto-import/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-auto-import/TestModulesAutoImport.py53
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-auto-import/main.m7
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-incomplete/Makefile8
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-incomplete/TestIncompleteModules.py61
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-incomplete/main.m11
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-incomplete/module.map4
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-incomplete/myModule.h8
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-incomplete/myModule.m14
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/Makefile9
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/TestModulesInlineFunctions.py55
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/main.m9
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/module.map4
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/myModule.c7
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/myModule.h7
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules/Makefile7
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules/TestObjCModules.py71
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/modules/main.m12
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc++/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc++/TestObjCXX.py33
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc++/main.mm19
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/TestObjCBaseClassSBType.py58
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/main.m22
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/Makefile5
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/TestObjCBuiltinTypes.py55
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/main.cpp9
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-checker/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-checker/TestObjCCheckers.py75
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-checker/main.m32
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-class-method/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-class-method/TestObjCClassMethod.py56
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-class-method/class.m24
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/.categories1
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/Makefile7
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/TestObjCDynamicSBType.py62
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/main.m53
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/TestObjCDynamicValue.py177
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/dynamic-value.m147
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/TestObjCIvarOffsets.py74
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/main.m15
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/objc-ivar-offsets.h27
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/objc-ivar-offsets.m19
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-ivar-protocols/TestIvarProtocols.py4
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-ivar-protocols/main.m33
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/Makefile15
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/TestObjCIvarStripped.py59
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/main.m33
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/Makefile7
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/TestObjCNewSyntax.py103
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/main.m21
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-optimized/Makefile8
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-optimized/TestObjcOptimized.py63
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-optimized/main.m44
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-property/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-property/TestObjCProperty.py114
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-property/main.m100
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/TestRuntimeIvars.py4
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/main.m10
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/Makefile15
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/TestObjCStaticMethodStripped.py65
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/static.m29
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-static-method/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-static-method/TestObjCStaticMethod.py61
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-static-method/static.m29
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-stepping/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-stepping/TestObjCStepping.py172
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-stepping/stepping-tests.m138
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/TestObjCStructArgument.py57
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/test.m34
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-struct-return/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-struct-return/TestObjCStructReturn.py53
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-struct-return/test.m23
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-super/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-super/TestObjCSuper.py59
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/objc-super/class.m39
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/print-obj/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/print-obj/TestPrintObj.py87
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/print-obj/blocked.m73
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/radar-9691614/Makefile7
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/radar-9691614/TestObjCMethodReturningBOOL.py45
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/radar-9691614/main.m67
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/rdar-10967107/Makefile7
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/rdar-10967107/TestRdar10967107.py44
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/rdar-10967107/main.m13
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/rdar-11355592/Makefile7
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/rdar-11355592/TestRdar11355592.py65
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/rdar-11355592/main.m37
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/rdar-12408181/Makefile11
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/rdar-12408181/TestRdar12408181.py48
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/rdar-12408181/main.m24
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/real-definition/Bar.h12
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/real-definition/Bar.m43
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/real-definition/Foo.h11
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/real-definition/Foo.m25
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/real-definition/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/real-definition/TestRealDefinition.py86
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/real-definition/main.m13
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/sample/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/sample/main.m70
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/self/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/self/TestObjCSelf.py36
-rw-r--r--packages/Python/lldbsuite/test/lang/objc/self/main.m54
-rw-r--r--packages/Python/lldbsuite/test/lang/objcxx/objcxx-ivar-vector/TestIvarVector.py4
-rw-r--r--packages/Python/lldbsuite/test/lang/objcxx/objcxx-ivar-vector/main.mm33
-rw-r--r--packages/Python/lldbsuite/test/lang/objcxx/sample/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/lang/objcxx/sample/main.mm71
350 files changed, 13976 insertions, 0 deletions
diff --git a/packages/Python/lldbsuite/test/lang/c/anonymous/Makefile b/packages/Python/lldbsuite/test/lang/c/anonymous/Makefile
new file mode 100644
index 000000000000..b09a579159d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/anonymous/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/anonymous/TestAnonymous.py b/packages/Python/lldbsuite/test/lang/c/anonymous/TestAnonymous.py
new file mode 100644
index 000000000000..7cb66ba8238b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/anonymous/TestAnonymous.py
@@ -0,0 +1,147 @@
+"""Test that anonymous structs/unions are transparent to member access"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class AnonymousTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipIfIcc # llvm.org/pr15036: LLDB generates an incorrect AST layout for an anonymous struct when DWARF is generated by ICC
+ def test_expr_nest(self):
+ self.build()
+ self.common_setup(self.line0)
+
+ # These should display correctly.
+ self.expect("expression n->foo.d", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 4"])
+
+ self.expect("expression n->b", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 2"])
+
+ def test_expr_child(self):
+ self.build()
+ self.common_setup(self.line1)
+
+ # These should display correctly.
+ self.expect("expression c->foo.d", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 4"])
+
+ self.expect("expression c->grandchild.b", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 2"])
+
+ @skipIfIcc # llvm.org/pr15036: This particular regression was introduced by r181498
+ def test_expr_grandchild(self):
+ self.build()
+ self.common_setup(self.line2)
+
+ # These should display correctly.
+ self.expect("expression g.child.foo.d", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 4"])
+
+ self.expect("expression g.child.b", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 2"])
+
+ def test_expr_parent(self):
+ self.build()
+ if "clang" in self.getCompiler() and "3.4" in self.getCompilerVersion():
+ self.skipTest("llvm.org/pr16214 -- clang emits partial DWARF for structures referenced via typedef")
+ self.common_setup(self.line2)
+
+ # These should display correctly.
+ self.expect("expression pz", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["(type_z *) $", " = 0x0000"])
+
+ self.expect("expression z.y", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["(type_y) $", "dummy = 2"])
+
+ @expectedFailureWindows('llvm.org/pr21550')
+ def test_expr_null(self):
+ self.build()
+ self.common_setup(self.line2)
+
+ # This should fail because pz is 0, but it succeeds on OS/X.
+ # This fails on Linux with an upstream error "Couldn't dematerialize struct", as does "p *n" with "int *n = 0".
+ # Note that this can also trigger llvm.org/pr15036 when run interactively at the lldb command prompt.
+ self.expect("expression *(type_z *)pz", error = True)
+
+ def test_child_by_name(self):
+ self.build()
+
+ # Set debugger into synchronous mode
+ self.dbg.SetAsync(False)
+
+ # Create a target
+ exe = os.path.join (os.getcwd(), "a.out")
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ break_in_main = target.BreakpointCreateBySourceRegex ('// Set breakpoint 2 here.', lldb.SBFileSpec(self.source))
+ self.assertTrue(break_in_main, VALID_BREAKPOINT)
+
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue (process, PROCESS_IS_VALID)
+
+ threads = lldbutil.get_threads_stopped_at_breakpoint (process, break_in_main)
+ if len(threads) != 1:
+ self.fail ("Failed to stop at breakpoint in main.")
+
+ thread = threads[0]
+ frame = thread.frames[0]
+
+ if not frame.IsValid():
+ self.fail ("Failed to get frame 0.")
+
+ var_n = frame.FindVariable("n")
+ if not var_n.IsValid():
+ self.fail ("Failed to get the variable 'n'")
+
+ elem_a = var_n.GetChildMemberWithName("a")
+ if not elem_a.IsValid():
+ self.fail ("Failed to get the element a in n")
+
+ error = lldb.SBError()
+ value = elem_a.GetValueAsSigned(error, 1000)
+ if not error.Success() or value != 0:
+ self.fail ("failed to get the correct value for element a in n")
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break in main.c.
+ self.source = 'main.c'
+ self.line0 = line_number(self.source, '// Set breakpoint 0 here.')
+ self.line1 = line_number(self.source, '// Set breakpoint 1 here.')
+ self.line2 = line_number(self.source, '// Set breakpoint 2 here.')
+
+ def common_setup(self, line):
+
+ # Set debugger into synchronous mode
+ self.dbg.SetAsync(False)
+
+ # Create a target
+ exe = os.path.join(os.getcwd(), "a.out")
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Set breakpoints inside and outside methods that take pointers to the containing struct.
+ lldbutil.run_break_set_by_file_and_line (self, self.source, line, num_expected_locations=1, loc_exact=True)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
diff --git a/packages/Python/lldbsuite/test/lang/c/anonymous/main.c b/packages/Python/lldbsuite/test/lang/c/anonymous/main.c
new file mode 100644
index 000000000000..58ac85b7d431
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/anonymous/main.c
@@ -0,0 +1,82 @@
+#include <stdio.h>
+
+struct anonymous_nest {
+ struct {
+ struct {
+ int a;
+ int b;
+ }; // anonymous
+ struct {
+ int c;
+ int d;
+ } foo;
+ }; // anonymous
+};
+
+struct anonymous_child {
+ struct {
+ struct {
+ int a;
+ int b;
+ } grandchild;
+ struct {
+ int c;
+ int d;
+ } foo;
+ }; // anonymous
+};
+
+struct anonymous_grandchild {
+ struct {
+ struct {
+ int a;
+ int b;
+ }; // anonymous
+ struct {
+ int c;
+ int d;
+ } foo;
+ } child;
+};
+
+int processor_nest (struct anonymous_nest *n)
+{
+ return n->foo.d + n->b; // Set breakpoint 0 here.
+}
+
+int processor_child (struct anonymous_child *c)
+{
+ return c->foo.d + c->grandchild.b; // Set breakpoint 1 here.
+}
+
+int processor_grandchild (struct anonymous_grandchild *g)
+{
+ return g->child.foo.d + g->child.b;
+}
+
+
+
+typedef struct {
+ int dummy;
+} type_y;
+
+typedef struct {
+ type_y y;
+} type_z;
+
+
+
+int main()
+{
+ struct anonymous_nest n = { 0, 2, 0, 4 };
+ struct anonymous_child c = { 0, 2, 0, 4 };
+ struct anonymous_grandchild g = { 0, 2, 0, 4 };
+ type_z *pz = 0;
+ type_z z = {{2}};
+
+ printf("%d\n", processor_nest(&n));
+ printf("%d\n", processor_child(&c));
+ printf("%d\n", processor_grandchild(&g)); // Set breakpoint 2 here.
+
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/array_types/Makefile b/packages/Python/lldbsuite/test/lang/c/array_types/Makefile
new file mode 100644
index 000000000000..b09a579159d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/array_types/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/array_types/TestArrayTypes.py b/packages/Python/lldbsuite/test/lang/c/array_types/TestArrayTypes.py
new file mode 100644
index 000000000000..e835fb096496
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/array_types/TestArrayTypes.py
@@ -0,0 +1,198 @@
+"""Test breakpoint by file/line number; and list variables with array types."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class ArrayTypesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.c', '// Set break point at this line.')
+
+ def test_and_run_command(self):
+ """Test 'frame variable var_name' on some variables with array types."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line, num_expected_locations=1, loc_exact=False)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The test suite sometimes shows that the process has exited without stopping.
+ #
+ # CC=clang ./dotest.py -v -t array_types
+ # ...
+ # Process 76604 exited with status = 0 (0x00000000)
+ self.runCmd("process status")
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = ['resolved, hit count = 1'])
+
+ # Issue 'variable list' command on several array-type variables.
+
+ self.expect("frame variable --show-types strings", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = '(char *[4])',
+ substrs = ['(char *) [0]',
+ '(char *) [1]',
+ '(char *) [2]',
+ '(char *) [3]',
+ 'Hello',
+ 'Hola',
+ 'Bonjour',
+ 'Guten Tag'])
+
+ self.expect("frame variable --show-types --raw -- char_16", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(char) [0]',
+ '(char) [15]'])
+
+ self.expect("frame variable --show-types ushort_matrix", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = '(unsigned short [2][3])')
+
+ self.expect("frame variable --show-types long_6", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = '(long [6])')
+
+ @add_test_categories(['pyapi'])
+ def test_and_python_api(self):
+ """Use Python APIs to inspect variables with array types."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ breakpoint = target.BreakpointCreateByLocation("main.c", self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ # Sanity check the print representation of breakpoint.
+ bp = str(breakpoint)
+ self.expect(bp, msg="Breakpoint looks good", exe=False,
+ substrs = ["file = 'main.c'",
+ "line = %d" % self.line,
+ "locations = 1"])
+ self.expect(bp, msg="Breakpoint is not resolved as yet", exe=False, matching=False,
+ substrs = ["resolved = 1"])
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # Sanity check the print representation of process.
+ proc = str(process)
+ self.expect(proc, msg="Process looks good", exe=False,
+ substrs = ["state = stopped",
+ "executable = a.out"])
+
+ # The stop reason of the thread should be breakpoint.
+ thread = process.GetThreadAtIndex(0)
+ if thread.GetStopReason() != lldb.eStopReasonBreakpoint:
+ from lldbsuite.test.lldbutil import stop_reason_to_str
+ self.fail(STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS %
+ stop_reason_to_str(thread.GetStopReason()))
+
+ # Sanity check the print representation of thread.
+ thr = str(thread)
+ # TODO(zturner): Whether the TID is printed in hex or decimal should be controlled by a setting,
+ # and this test should read the value of the setting. This check is currently hardcoded to
+ # match the check in Core/FormatEntity.cpp in the function FormatEntity::Format() for
+ # the Entry::Type::ThreadID case of the switch statement.
+ if self.getPlatform() == "linux" or self.getPlatform() == "freebsd":
+ tidstr = "tid = %u" % thread.GetThreadID()
+ else:
+ tidstr = "tid = 0x%4.4x" % thread.GetThreadID()
+ self.expect(thr, "Thread looks good with stop reason = breakpoint", exe=False,
+ substrs = [tidstr])
+
+ # The breakpoint should have a hit count of 1.
+ self.assertTrue(breakpoint.GetHitCount() == 1, BREAKPOINT_HIT_ONCE)
+
+ # The breakpoint should be resolved by now.
+ bp = str(breakpoint)
+ self.expect(bp, "Breakpoint looks good and is resolved", exe=False,
+ substrs = ["file = 'main.c'",
+ "line = %d" % self.line,
+ "locations = 1"])
+
+ # Sanity check the print representation of frame.
+ frame = thread.GetFrameAtIndex(0)
+ frm = str(frame)
+ self.expect(frm,
+ "Frame looks good with correct index %d" % frame.GetFrameID(),
+ exe=False,
+ substrs = ["#%d" % frame.GetFrameID()])
+
+ # Lookup the "strings" string array variable and sanity check its print
+ # representation.
+ variable = frame.FindVariable("strings")
+ var = str(variable)
+ self.expect(var, "Variable for 'strings' looks good with correct name", exe=False,
+ substrs = ["%s" % variable.GetName()])
+ self.DebugSBValue(variable)
+ self.assertTrue(variable.GetNumChildren() == 4,
+ "Variable 'strings' should have 4 children")
+
+ child3 = variable.GetChildAtIndex(3)
+ self.DebugSBValue(child3)
+ self.assertTrue(child3.GetSummary() == '"Guten Tag"',
+ 'strings[3] == "Guten Tag"')
+
+ # Lookup the "char_16" char array variable.
+ variable = frame.FindVariable("char_16")
+ self.DebugSBValue(variable)
+ self.assertTrue(variable.GetNumChildren() == 16,
+ "Variable 'char_16' should have 16 children")
+
+ # Lookup the "ushort_matrix" ushort[] array variable.
+ # Notice the pattern of int(child0_2.GetValue(), 0). We pass a
+ # base of 0 so that the proper radix is determined based on the contents
+ # of the string. Same applies to long().
+ variable = frame.FindVariable("ushort_matrix")
+ self.DebugSBValue(variable)
+ self.assertTrue(variable.GetNumChildren() == 2,
+ "Variable 'ushort_matrix' should have 2 children")
+ child0 = variable.GetChildAtIndex(0)
+ self.DebugSBValue(child0)
+ self.assertTrue(child0.GetNumChildren() == 3,
+ "Variable 'ushort_matrix[0]' should have 3 children")
+ child0_2 = child0.GetChildAtIndex(2)
+ self.DebugSBValue(child0_2)
+ self.assertTrue(int(child0_2.GetValue(), 0) == 3,
+ "ushort_matrix[0][2] == 3")
+
+ # Lookup the "long_6" char array variable.
+ variable = frame.FindVariable("long_6")
+ self.DebugSBValue(variable)
+ self.assertTrue(variable.GetNumChildren() == 6,
+ "Variable 'long_6' should have 6 children")
+ child5 = variable.GetChildAtIndex(5)
+ self.DebugSBValue(child5)
+ self.assertTrue(int(child5.GetValue(), 0) == 6,
+ "long_6[5] == 6")
+
+ # Last, check that "long_6" has a value type of eValueTypeVariableLocal
+ # and "argc" has eValueTypeVariableArgument.
+ from lldbsuite.test.lldbutil import value_type_to_str
+ self.assertTrue(variable.GetValueType() == lldb.eValueTypeVariableLocal,
+ "Variable 'long_6' should have '%s' value type." %
+ value_type_to_str(lldb.eValueTypeVariableLocal))
+ argc = frame.FindVariable("argc")
+ self.DebugSBValue(argc)
+ self.assertTrue(argc.GetValueType() == lldb.eValueTypeVariableArgument,
+ "Variable 'argc' should have '%s' value type." %
+ value_type_to_str(lldb.eValueTypeVariableArgument))
diff --git a/packages/Python/lldbsuite/test/lang/c/array_types/cmds.txt b/packages/Python/lldbsuite/test/lang/c/array_types/cmds.txt
new file mode 100644
index 000000000000..8feebe212044
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/array_types/cmds.txt
@@ -0,0 +1,3 @@
+break main.c:42
+continue
+var
diff --git a/packages/Python/lldbsuite/test/lang/c/array_types/main.c b/packages/Python/lldbsuite/test/lang/c/array_types/main.c
new file mode 100644
index 000000000000..5f0680a43b84
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/array_types/main.c
@@ -0,0 +1,51 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+int main (int argc, char const *argv[])
+{
+ struct point_tag {
+ int x;
+ int y;
+ };
+
+ struct rect_tag {
+ struct point_tag bottom_left;
+ struct point_tag top_right;
+ };
+ char char_16[16] = "Hello World\n";
+ char *strings[] = { "Hello", "Hola", "Bonjour", "Guten Tag" };
+ char char_matrix[3][3] = {{'a', 'b', 'c' }, {'d', 'e', 'f' }, {'g', 'h', 'i' }};
+ char char_matrix_matrix[3][2][3] =
+ { {{'a', 'b', 'c' }, {'d', 'e', 'f' }},
+ {{'A', 'B', 'C' }, {'D', 'E', 'F' }},
+ {{'1', '2', '3' }, {'4', '5', '6' }}};
+ short short_4[4] = { 1,2,3,4 };
+ short short_matrix[1][2] = { {1,2} };
+ unsigned short ushort_4[4] = { 1,2,3,4 };
+ unsigned short ushort_matrix[2][3] = {
+ { 1, 2, 3},
+ {11,22,33}
+ };
+ int int_2[2] = { 1, 2 };
+ unsigned int uint_2[2] = { 1, 2 };
+ long long_6[6] = { 1, 2, 3, 4, 5, 6 };
+ unsigned long ulong_6[6] = { 1, 2, 3, 4, 5, 6 };
+ struct point_tag points_2[2] = {
+ {1,2},
+ {3,4}
+ };
+ struct point_tag points_2_4_matrix[2][4] = { // Set break point at this line.
+ {{ 1, 2}, { 3, 4}, { 5, 6}, { 7, 8}},
+ {{11,22}, {33,44}, {55,66}, {77,88}}
+ };
+ struct rect_tag rects_2[2] = {
+ {{1,2}, {3,4}},
+ {{5,6}, {7,8}}
+ };
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/bitfields/Makefile b/packages/Python/lldbsuite/test/lang/c/bitfields/Makefile
new file mode 100644
index 000000000000..b09a579159d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/bitfields/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/bitfields/TestBitfields.py b/packages/Python/lldbsuite/test/lang/c/bitfields/TestBitfields.py
new file mode 100644
index 000000000000..de7a333a18fa
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/bitfields/TestBitfields.py
@@ -0,0 +1,162 @@
+"""Show bitfields and check that they display correctly."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class BitfieldsTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.c', '// Set break point at this line.')
+
+ @skipIfWindows # BitFields exhibit crashes in record layout on Windows (http://llvm.org/pr21800)
+ def test_and_run_command(self):
+ """Test 'frame variable ...' on a variable with bitfields."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the main.
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # This should display correctly.
+ self.expect("frame variable --show-types bits", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(uint32_t:1) b1 = 1',
+ '(uint32_t:2) b2 = 3',
+ '(uint32_t:3) b3 = 7',
+ '(uint32_t) b4 = 15',
+ '(uint32_t:5) b5 = 31',
+ '(uint32_t:6) b6 = 63',
+ '(uint32_t:7) b7 = 127',
+ '(uint32_t:4) four = 15'])
+
+ # And so should this.
+ # rdar://problem/8348251
+ self.expect("frame variable --show-types", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(uint32_t:1) b1 = 1',
+ '(uint32_t:2) b2 = 3',
+ '(uint32_t:3) b3 = 7',
+ '(uint32_t) b4 = 15',
+ '(uint32_t:5) b5 = 31',
+ '(uint32_t:6) b6 = 63',
+ '(uint32_t:7) b7 = 127',
+ '(uint32_t:4) four = 15'])
+
+ self.expect("expr (bits.b1)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint32_t', '1'])
+ self.expect("expr (bits.b2)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint32_t', '3'])
+ self.expect("expr (bits.b3)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint32_t', '7'])
+ self.expect("expr (bits.b4)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint32_t', '15'])
+ self.expect("expr (bits.b5)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint32_t', '31'])
+ self.expect("expr (bits.b6)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint32_t', '63'])
+ self.expect("expr (bits.b7)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint32_t', '127'])
+ self.expect("expr (bits.four)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint32_t', '15'])
+
+ self.expect("frame variable --show-types more_bits", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(uint32_t:3) a = 3',
+ '(uint8_t:1) b = \'\\0\'',
+ '(uint8_t:1) c = \'\\x01\'',
+ '(uint8_t:1) d = \'\\0\''])
+
+ self.expect("expr (more_bits.a)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint32_t', '3'])
+ self.expect("expr (more_bits.b)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint8_t', '\\0'])
+ self.expect("expr (more_bits.c)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint8_t', '\\x01'])
+ self.expect("expr (more_bits.d)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['uint8_t', '\\0'])
+
+ @add_test_categories(['pyapi'])
+ @skipIfWindows # BitFields exhibit crashes in record layout on Windows (http://llvm.org/pr21800)
+ def test_and_python_api(self):
+ """Use Python APIs to inspect a bitfields variable."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ breakpoint = target.BreakpointCreateByLocation("main.c", self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread = target.GetProcess().GetThreadAtIndex(0)
+ if thread.GetStopReason() != lldb.eStopReasonBreakpoint:
+ from lldbsuite.test.lldbutil import stop_reason_to_str
+ self.fail(STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS %
+ stop_reason_to_str(thread.GetStopReason()))
+
+ # The breakpoint should have a hit count of 1.
+ self.assertTrue(breakpoint.GetHitCount() == 1, BREAKPOINT_HIT_ONCE)
+
+ # Lookup the "bits" variable which contains 8 bitfields.
+ frame = thread.GetFrameAtIndex(0)
+ bits = frame.FindVariable("bits")
+ self.DebugSBValue(bits)
+ self.assertTrue(bits.GetTypeName() == 'Bits', "bits.GetTypeName() == 'Bits'");
+ self.assertTrue(bits.GetNumChildren() == 10, "bits.GetNumChildren() == 10");
+ test_compiler = self.getCompiler()
+ self.assertTrue(bits.GetByteSize() == 32, "bits.GetByteSize() == 32");
+
+ # Notice the pattern of int(b1.GetValue(), 0). We pass a base of 0
+ # so that the proper radix is determined based on the contents of the
+ # string.
+ b1 = bits.GetChildMemberWithName("b1")
+ self.DebugSBValue(b1)
+ self.assertTrue(b1.GetName() == "b1" and
+ b1.GetTypeName() == "uint32_t:1" and
+ b1.IsInScope() and
+ int(b1.GetValue(), 0) == 1,
+ 'bits.b1 has type uint32_t:1, is in scope, and == 1')
+
+ b7 = bits.GetChildMemberWithName("b7")
+ self.DebugSBValue(b7)
+ self.assertTrue(b7.GetName() == "b7" and
+ b7.GetTypeName() == "uint32_t:7" and
+ b7.IsInScope() and
+ int(b7.GetValue(), 0) == 127,
+ 'bits.b7 has type uint32_t:7, is in scope, and == 127')
+
+ four = bits.GetChildMemberWithName("four")
+ self.DebugSBValue(four)
+ self.assertTrue(four.GetName() == "four" and
+ four.GetTypeName() == "uint32_t:4" and
+ four.IsInScope() and
+ int(four.GetValue(), 0) == 15,
+ 'bits.four has type uint32_t:4, is in scope, and == 15')
+
+ # Now kill the process, and we are done.
+ rc = target.GetProcess().Kill()
+ self.assertTrue(rc.Success())
diff --git a/packages/Python/lldbsuite/test/lang/c/bitfields/main.c b/packages/Python/lldbsuite/test/lang/c/bitfields/main.c
new file mode 100644
index 000000000000..26c0176d759c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/bitfields/main.c
@@ -0,0 +1,67 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdint.h>
+#include <stdio.h>
+int main (int argc, char const *argv[])
+{
+ struct Bits
+ {
+ uint32_t : 1, // Unnamed bitfield
+ b1 : 1,
+ b2 : 2,
+ : 2, // Unnamed bitfield
+ b3 : 3,
+ : 2, // Unnamed bitfield (this will get removed)
+ b4 __attribute__ ((aligned(16))),
+ b5 : 5,
+ b6 : 6,
+ b7 : 7,
+ four : 4;
+ };
+
+ printf("%lu", sizeof(struct Bits));
+
+ struct Bits bits;
+ int i;
+ for (i=0; i<(1<<1); i++)
+ bits.b1 = i; //// break $source:$line
+ for (i=0; i<(1<<2); i++)
+ bits.b2 = i; //// break $source:$line
+ for (i=0; i<(1<<3); i++)
+ bits.b3 = i; //// break $source:$line
+ for (i=0; i<(1<<4); i++)
+ bits.b4 = i; //// break $source:$line
+ for (i=0; i<(1<<5); i++)
+ bits.b5 = i; //// break $source:$line
+ for (i=0; i<(1<<6); i++)
+ bits.b6 = i; //// break $source:$line
+ for (i=0; i<(1<<7); i++)
+ bits.b7 = i; //// break $source:$line
+ for (i=0; i<(1<<4); i++)
+ bits.four = i; //// break $source:$line
+
+ struct MoreBits
+ {
+ uint32_t a : 3;
+ uint8_t : 1;
+ uint8_t b : 1;
+ uint8_t c : 1;
+ uint8_t d : 1;
+ };
+
+ struct MoreBits more_bits;
+
+ more_bits.a = 3;
+ more_bits.b = 0;
+ more_bits.c = 1;
+ more_bits.d = 0;
+
+ return 0; //// Set break point at this line.
+
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/blocks/Makefile b/packages/Python/lldbsuite/test/lang/c/blocks/Makefile
new file mode 100644
index 000000000000..752b7aed3970
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/blocks/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+CFLAGS_EXTRAS += -fblocks
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/blocks/TestBlocks.py b/packages/Python/lldbsuite/test/lang/c/blocks/TestBlocks.py
new file mode 100644
index 000000000000..8f1c3be22836
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/blocks/TestBlocks.py
@@ -0,0 +1,61 @@
+"""Test that lldb can invoke blocks and access variables inside them"""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class BlocksTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+ lines = []
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break at.
+ self.lines.append(line_number('main.c', '// Set breakpoint 0 here.'))
+ self.lines.append(line_number('main.c', '// Set breakpoint 1 here.'))
+
+ @unittest2.expectedFailure("rdar://problem/10413887 - Call blocks in expressions")
+ def test_expr(self):
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ self.is_started = False
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ for line in self.lines:
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", line, num_expected_locations=1, loc_exact=True)
+
+ self.wait_for_breakpoint()
+
+ self.expect("expression a + b", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 7"])
+
+ self.expect("expression c", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 1"])
+
+ self.wait_for_breakpoint()
+
+ # This should display correctly.
+ self.expect("expression (int)neg (-12)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 12"])
+
+ def wait_for_breakpoint(self):
+ if self.is_started == False:
+ self.is_started = True
+ self.runCmd("process launch", RUN_SUCCEEDED)
+ else:
+ self.runCmd("process continue", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
diff --git a/packages/Python/lldbsuite/test/lang/c/blocks/main.c b/packages/Python/lldbsuite/test/lang/c/blocks/main.c
new file mode 100644
index 000000000000..415e6c6d033d
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/blocks/main.c
@@ -0,0 +1,21 @@
+#include <stdio.h>
+
+int main()
+{
+ int c = 1;
+
+ int (^add)(int, int) = ^int(int a, int b)
+ {
+ return a + b + c; // Set breakpoint 0 here.
+ };
+
+ int (^neg)(int) = ^int(int a)
+ {
+ return -a;
+ };
+
+ printf("%d\n", add(3, 4));
+ printf("%d\n", neg(-5)); // Set breakpoint 1 here.
+
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/const_variables/Makefile b/packages/Python/lldbsuite/test/lang/c/const_variables/Makefile
new file mode 100644
index 000000000000..51adad1d0622
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/const_variables/Makefile
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c functions.c
+
+CFLAGS_EXTRAS += -O3
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/const_variables/TestConstVariables.py b/packages/Python/lldbsuite/test/lang/c/const_variables/TestConstVariables.py
new file mode 100644
index 000000000000..a112b2a1777c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/const_variables/TestConstVariables.py
@@ -0,0 +1,64 @@
+"""Check that compiler-generated constant values work correctly"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class ConstVariableTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureAll(
+ oslist=["freebsd", "linux"],
+ compiler="clang", compiler_version=["<", "3.5"])
+ @expectedFailureAll(
+ oslist=["freebsd", "linux"],
+ compiler="clang", compiler_version=["=", "3.7"])
+ @expectedFailureAll(
+ oslist=["freebsd", "linux"],
+ compiler="clang", compiler_version=["=", "3.8"])
+ @expectedFailureAll(oslist=["freebsd", "linux"], compiler="icc")
+ @expectedFailureAll(archs=['mips', 'mipsel', 'mips64', 'mips64el'])
+ @expectedFailureWindows("llvm.org/pr24489: Name lookup not working correctly on Windows")
+ @expectedFailureWindows("llvm.org/pr24490: We shouldn't be using platform-specific names like `getpid` in tests")
+ def test_and_run_command(self):
+ """Test interpreted and JITted expressions on constant values."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the main.
+ lldbutil.run_break_set_by_symbol (self, "main", num_expected_locations=1)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ self.runCmd("next")
+ self.runCmd("next")
+
+ # Try frame variable.
+ self.expect("frame variable index", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(int32_t) index = 512'])
+
+ # Try an interpreted expression.
+ self.expect("expr (index + 512)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['1024'])
+
+ # Try a JITted expression.
+ self.expect("expr (int)getpid(); (index - 256)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['256'])
+
+ self.runCmd("kill")
diff --git a/packages/Python/lldbsuite/test/lang/c/const_variables/functions.c b/packages/Python/lldbsuite/test/lang/c/const_variables/functions.c
new file mode 100644
index 000000000000..c9ea63837c8b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/const_variables/functions.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+
+void foo()
+{
+ printf("foo()\n");
+}
+
+int bar()
+{
+ int ret = 3;
+ printf("bar()->%d\n", ret);
+ return ret;
+}
+
+void baaz(int i)
+{
+ printf("baaz(%d)\n", i);
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/const_variables/main.c b/packages/Python/lldbsuite/test/lang/c/const_variables/main.c
new file mode 100644
index 000000000000..50a924e01d94
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/const_variables/main.c
@@ -0,0 +1,23 @@
+#include <stdint.h>
+#include <stdio.h>
+
+extern int foo();
+extern int bar();
+extern int baaz(int i);
+
+int main()
+{
+ int32_t index;
+
+ foo();
+
+ index = 512;
+
+ if (bar())
+ {
+ printf("COMPILER PLEASE STOP HERE\n");
+ index = 256;
+ }
+
+ baaz(index);
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/enum_types/Makefile b/packages/Python/lldbsuite/test/lang/c/enum_types/Makefile
new file mode 100644
index 000000000000..b09a579159d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/enum_types/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/enum_types/TestEnumTypes.py b/packages/Python/lldbsuite/test/lang/c/enum_types/TestEnumTypes.py
new file mode 100644
index 000000000000..b0c5c882f6a9
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/enum_types/TestEnumTypes.py
@@ -0,0 +1,71 @@
+"""Look up enum type information and check for correct display."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class EnumTypesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.c', '// Set break point at this line.')
+
+ def test(self):
+ """Test 'image lookup -t days' and check for correct display and enum value printing."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the main.
+ bkpt_id = lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # Look up information about the 'days' enum type.
+ # Check for correct display.
+ self.expect("image lookup -t days", DATA_TYPES_DISPLAYED_CORRECTLY,
+ substrs = ['enum days {',
+ 'Monday',
+ 'Tuesday',
+ 'Wednesday',
+ 'Thursday',
+ 'Friday',
+ 'Saturday',
+ 'Sunday',
+ 'kNumDays',
+ '}'])
+
+ enum_values = [ '-4',
+ 'Monday',
+ 'Tuesday',
+ 'Wednesday',
+ 'Thursday',
+ 'Friday',
+ 'Saturday',
+ 'Sunday',
+ 'kNumDays',
+ '5'];
+
+ bkpt = self.target().FindBreakpointByID(bkpt_id)
+ for enum_value in enum_values:
+ self.expect("frame variable day", 'check for valid enumeration value',
+ substrs = [enum_value])
+ lldbutil.continue_to_breakpoint (self.process(), bkpt)
diff --git a/packages/Python/lldbsuite/test/lang/c/enum_types/main.c b/packages/Python/lldbsuite/test/lang/c/enum_types/main.c
new file mode 100644
index 000000000000..3d59654eff69
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/enum_types/main.c
@@ -0,0 +1,29 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdio.h>
+
+int main (int argc, char const *argv[])
+{
+ enum days {
+ Monday = -3,
+ Tuesday,
+ Wednesday,
+ Thursday,
+ Friday,
+ Saturday,
+ Sunday,
+ kNumDays
+ };
+ enum days day;
+ for (day = Monday - 1; day <= kNumDays + 1; day++)
+ {
+ printf("day as int is %i\n", (int)day); // Set break point at this line.
+ }
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/forward/Makefile b/packages/Python/lldbsuite/test/lang/c/forward/Makefile
new file mode 100644
index 000000000000..1db43ab479b2
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/forward/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c foo.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/forward/README.txt b/packages/Python/lldbsuite/test/lang/c/forward/README.txt
new file mode 100644
index 000000000000..b7b66f75162b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/forward/README.txt
@@ -0,0 +1,5 @@
+This example has a function call in foo.c named "foo" that takes a forward
+declaration to "struct bar" and uses it as a pointer argument. In main.c
+we have a real declaration for "struct bar". We want to be able to find the
+real definition of "struct bar" when we are stopped in foo in foo.c such that
+when we stop in "foo" we see the contents of the "bar_ptr".
diff --git a/packages/Python/lldbsuite/test/lang/c/forward/TestForwardDeclaration.py b/packages/Python/lldbsuite/test/lang/c/forward/TestForwardDeclaration.py
new file mode 100644
index 000000000000..33c0de2d72d3
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/forward/TestForwardDeclaration.py
@@ -0,0 +1,47 @@
+"""Test that forward declaration of a data structure gets resolved correctly."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class ForwardDeclarationTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_and_run_command(self):
+ """Display *bar_ptr when stopped on a function with forward declaration of struct bar."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ lldbutil.run_break_set_by_symbol (self, "foo", num_expected_locations=1, sym_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # This should display correctly.
+ # Note that the member fields of a = 1 and b = 2 is by design.
+ self.expect("frame variable --show-types *bar_ptr", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(bar) *bar_ptr = ',
+ '(int) a = 1',
+ '(int) b = 2'])
+
+ # And so should this.
+ self.expect("expression --show-types -- *bar_ptr", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(bar)',
+ '(int) a = 1',
+ '(int) b = 2'])
diff --git a/packages/Python/lldbsuite/test/lang/c/forward/foo.c b/packages/Python/lldbsuite/test/lang/c/forward/foo.c
new file mode 100644
index 000000000000..2e050e77778d
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/forward/foo.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+#include "foo.h"
+
+int
+foo (struct bar *bar_ptr)
+{
+ return printf ("bar_ptr = %p\n", bar_ptr);
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/forward/foo.h b/packages/Python/lldbsuite/test/lang/c/forward/foo.h
new file mode 100644
index 000000000000..3040927cb47a
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/forward/foo.h
@@ -0,0 +1,4 @@
+
+struct bar;
+
+int foo (struct bar *bar_ptr);
diff --git a/packages/Python/lldbsuite/test/lang/c/forward/main.c b/packages/Python/lldbsuite/test/lang/c/forward/main.c
new file mode 100644
index 000000000000..6f9787c30a36
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/forward/main.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+#include "foo.h"
+
+struct bar
+{
+ int a;
+ int b;
+};
+
+int
+main (int argc, char const *argv[])
+{
+ struct bar b= { 1, 2 };
+
+ foo (&b);
+
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/function_types/Makefile b/packages/Python/lldbsuite/test/lang/c/function_types/Makefile
new file mode 100644
index 000000000000..b09a579159d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/function_types/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/function_types/TestFunctionTypes.py b/packages/Python/lldbsuite/test/lang/c/function_types/TestFunctionTypes.py
new file mode 100644
index 000000000000..2f9f1d10b58c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/function_types/TestFunctionTypes.py
@@ -0,0 +1,76 @@
+"""Test variable with function ptr type and that break on the function works."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class FunctionTypesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.c', '// Set break point at this line.')
+
+ def test(self):
+ """Test 'callback' has function ptr type, then break on the function."""
+ self.build()
+ self.runToBreakpoint()
+
+ # Check that the 'callback' variable display properly.
+ self.expect("frame variable --show-types callback", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = '(int (*)(const char *)) callback =')
+
+ # And that we can break on the callback function.
+ lldbutil.run_break_set_by_symbol (self, "string_not_empty", num_expected_locations=1, sym_exact=True)
+ self.runCmd("continue")
+
+ # Check that we do indeed stop on the string_not_empty function.
+ self.expect("process status", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['a.out`string_not_empty',
+ 'stop reason = breakpoint'])
+
+ @expectedFailureWindows("llvm.org/pr21765")
+ def test_pointers(self):
+ """Test that a function pointer to 'printf' works and can be called."""
+ self.build()
+ self.runToBreakpoint()
+
+ self.expect("expr string_not_empty",
+ substrs = ['(int (*)(const char *)) $0 = ', '(a.out`'])
+
+ if self.platformIsDarwin():
+ regexps = ['lib.*\.dylib`printf']
+ else:
+ regexps = ['printf']
+ self.expect("expr (int (*)(const char*, ...))printf",
+ substrs = ['(int (*)(const char *, ...)) $1 = '],
+ patterns = regexps)
+
+ self.expect("expr $1(\"Hello world\\n\")",
+ startstr = '(int) $2 = 12')
+
+ def runToBreakpoint(self):
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the main.
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
diff --git a/packages/Python/lldbsuite/test/lang/c/function_types/main.c b/packages/Python/lldbsuite/test/lang/c/function_types/main.c
new file mode 100644
index 000000000000..8be3c4d46b3c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/function_types/main.c
@@ -0,0 +1,22 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int string_not_empty (const char *s)
+{
+ if (s && s[0])
+ return 1;
+ return 0;
+}
+
+int main (int argc, char const *argv[])
+{
+ int (*callback)(const char *) = string_not_empty;
+
+ return callback(0); // Set break point at this line.
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/global_variables/Makefile b/packages/Python/lldbsuite/test/lang/c/global_variables/Makefile
new file mode 100644
index 000000000000..b1b77dacc01e
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/global_variables/Makefile
@@ -0,0 +1,8 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+DYLIB_NAME := a
+DYLIB_C_SOURCES := a.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/global_variables/TestGlobalVariables.py b/packages/Python/lldbsuite/test/lang/c/global_variables/TestGlobalVariables.py
new file mode 100644
index 000000000000..1f91cd1660c3
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/global_variables/TestGlobalVariables.py
@@ -0,0 +1,76 @@
+"""Show global variables and check that they do indeed have global scopes."""
+
+from __future__ import print_function
+
+
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class GlobalVariablesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.source = 'main.c'
+ self.line = line_number(self.source, '// Set break point at this line.')
+ self.shlib_names = ["a"]
+
+ @expectedFailureWindows("llvm.org/pr24764")
+ @expectedFailureAll("llvm.org/pr25872", oslist=["macosx"], debug_info="dwarf")
+ def test_c_global_variables(self):
+ """Test 'frame variable --scope --no-args' which omits args and shows scopes."""
+ self.build()
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget("a.out")
+ self.assertTrue(target, VALID_TARGET)
+
+ # Break inside the main.
+ lldbutil.run_break_set_by_file_and_line (self, self.source, self.line, num_expected_locations=1, loc_exact=True)
+
+ # Register our shared libraries for remote targets so they get automatically uploaded
+ environment = self.registerSharedLibrariesWithTarget(target, self.shlib_names)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, environment, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # Check that GLOBAL scopes are indicated for the variables.
+ self.expect("frame variable --show-types --scope --show-globals --no-args", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['GLOBAL: (int) g_file_global_int = 42',
+ 'STATIC: (const int) g_file_static_int = 2',
+ 'GLOBAL: (const char *) g_file_global_cstr',
+ '"g_file_global_cstr"',
+ 'STATIC: (const char *) g_file_static_cstr',
+ '"g_file_static_cstr"',
+ 'GLOBAL: (int) g_common_1 = 21'])
+
+ # 'frame variable' should support address-of operator.
+ self.runCmd("frame variable &g_file_global_int")
+
+ # Exercise the 'target variable' command to display globals in a.c file.
+ self.expect("target variable g_a", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['g_a', '123'])
+ self.expect("target variable g_marked_spot.x", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['g_marked_spot.x', '20'])
+
+ # rdar://problem/9747668
+ # runCmd: target variable g_marked_spot.y
+ # output: (int) g_marked_spot.y = <a.o[0x214] can't be resolved, in not currently loaded.
+ # >
+ self.expect("target variable g_marked_spot.y", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['g_marked_spot.y', '21'])
+ self.expect("target variable g_marked_spot.y", VARIABLES_DISPLAYED_CORRECTLY, matching=False,
+ substrs = ["can't be resolved"])
diff --git a/packages/Python/lldbsuite/test/lang/c/global_variables/a.c b/packages/Python/lldbsuite/test/lang/c/global_variables/a.c
new file mode 100644
index 000000000000..d169d5d63240
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/global_variables/a.c
@@ -0,0 +1,15 @@
+//===-- a.c -----------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+int g_a = 123;
+struct Point {
+ int x;
+ int y;
+};
+struct Point g_marked_spot = { 20, 21 };
+
diff --git a/packages/Python/lldbsuite/test/lang/c/global_variables/cmds.txt b/packages/Python/lldbsuite/test/lang/c/global_variables/cmds.txt
new file mode 100644
index 000000000000..6906a0729aeb
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/global_variables/cmds.txt
@@ -0,0 +1,3 @@
+break main.c:5
+continue
+var -global g_a -global g_global_int
diff --git a/packages/Python/lldbsuite/test/lang/c/global_variables/main.c b/packages/Python/lldbsuite/test/lang/c/global_variables/main.c
new file mode 100644
index 000000000000..499b2504774f
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/global_variables/main.c
@@ -0,0 +1,24 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdio.h>
+
+int g_common_1; // Not initialized on purpose to cause it to be undefined external in .o file
+int g_file_global_int = 42;
+static const int g_file_static_int = 2;
+const char *g_file_global_cstr = "g_file_global_cstr";
+static const char *g_file_static_cstr = "g_file_static_cstr";
+
+extern int g_a;
+int main (int argc, char const *argv[])
+{
+ g_common_1 = g_file_global_int / g_file_static_int;
+ static const char *g_func_static_cstr = "g_func_static_cstr";
+ printf ("%s %s\n", g_file_global_cstr, g_file_static_cstr);
+ return g_file_global_int + g_a + g_common_1; // Set break point at this line. //// break $source:$line; continue; var -global g_a -global g_global_int
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/inlines/Makefile b/packages/Python/lldbsuite/test/lang/c/inlines/Makefile
new file mode 100644
index 000000000000..c5b0d18f995d
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/inlines/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := inlines.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/inlines/inlines.c b/packages/Python/lldbsuite/test/lang/c/inlines/inlines.c
new file mode 100644
index 000000000000..1e920f1ef2f6
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/inlines/inlines.c
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include "inlines.h"
+
+#define INLINE_ME __inline__ __attribute__((always_inline))
+
+int
+not_inlined_2 (int input)
+{
+ printf ("Called in not_inlined_2 with : %d.\n", input);
+ return input;
+}
+
+int
+not_inlined_1 (int input)
+{
+ printf ("Called in not_inlined_1 with %d.\n", input);
+ return not_inlined_2(input);
+}
+
+INLINE_ME int
+inner_inline (int inner_input, int mod_value)
+{
+ int inner_result;
+ inner_result = inner_input % mod_value;
+ printf ("Returning: %d.\n", inner_result);
+ return not_inlined_1 (inner_result);
+}
+
+INLINE_ME int
+outer_inline (int outer_input)
+{
+ int outer_result;
+
+ outer_result = inner_inline (outer_input, outer_input % 3);
+ return outer_result;
+}
+
+int
+main (int argc, char **argv)
+{
+ printf ("Starting...\n");
+
+ int (*func_ptr) (int);
+ func_ptr = outer_inline;
+
+ outer_inline (argc);
+
+ func_ptr (argc);
+
+ return 0;
+}
+
+
diff --git a/packages/Python/lldbsuite/test/lang/c/inlines/inlines.h b/packages/Python/lldbsuite/test/lang/c/inlines/inlines.h
new file mode 100644
index 000000000000..265d7b4966ed
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/inlines/inlines.h
@@ -0,0 +1,4 @@
+int inner_inline (int inner_input, int mod_value);
+int outer_inline (int outer_input);
+int not_inlined_2 (int input);
+int not_inlined_1 (int input);
diff --git a/packages/Python/lldbsuite/test/lang/c/modules/Makefile b/packages/Python/lldbsuite/test/lang/c/modules/Makefile
new file mode 100644
index 000000000000..b09a579159d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/modules/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/modules/TestCModules.py b/packages/Python/lldbsuite/test/lang/c/modules/TestCModules.py
new file mode 100644
index 000000000000..cd31f9dbacfe
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/modules/TestCModules.py
@@ -0,0 +1,65 @@
+"""Test that importing modules in C works as expected."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import platform
+import lldbsuite.test.lldbutil as lldbutil
+
+from distutils.version import StrictVersion
+
+from lldbsuite.test.lldbtest import *
+
+class CModulesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipIfFreeBSD
+ @expectedFailureDarwin('http://llvm.org/pr24302')
+ @expectedFailureLinux('http://llvm.org/pr23456') # 'fopen' has unknown return type
+ @expectedFailureWindows("llvm.org/pr24489: Name lookup not working correctly on Windows")
+ def test_expr(self):
+ if platform.system() == "Darwin" and platform.release() < StrictVersion('12.0.0'):
+ self.skipTest()
+
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ self.expect("expr @import Darwin; 3", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["int", "3"])
+
+ self.expect("expr *fopen(\"/dev/zero\", \"w\")", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["FILE", "_close", "__sclose"])
+
+ self.expect("expr *myFile", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["a", "5", "b", "9"])
+
+ self.expect("expr MIN((uint64_t)2, (uint64_t)3)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["uint64_t", "2"])
+
+ self.expect("expr stdin", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["(FILE *)", "0x"])
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.c', '// Set breakpoint 0 here.')
diff --git a/packages/Python/lldbsuite/test/lang/c/modules/main.c b/packages/Python/lldbsuite/test/lang/c/modules/main.c
new file mode 100644
index 000000000000..2b244bc38d02
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/modules/main.c
@@ -0,0 +1,20 @@
+#include <stdlib.h>
+
+int printf(const char * __restrict format, ...);
+
+typedef struct {
+ int a;
+ int b;
+} FILE;
+
+int main()
+{
+ FILE *myFile = malloc(sizeof(FILE));
+
+ myFile->a = 5;
+ myFile->b = 9;
+
+ printf("%d\n", myFile->a + myFile->b); // Set breakpoint 0 here.
+
+ free(myFile);
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/recurse/Makefile b/packages/Python/lldbsuite/test/lang/c/recurse/Makefile
new file mode 100644
index 000000000000..b09a579159d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/recurse/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/recurse/main.c b/packages/Python/lldbsuite/test/lang/c/recurse/main.c
new file mode 100644
index 000000000000..1159669ebf15
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/recurse/main.c
@@ -0,0 +1,28 @@
+#include <stdint.h>
+#include <stdio.h>
+
+uint32_t
+recurse_crash (uint32_t depth)
+{
+ if (depth > 0)
+ return recurse_crash (depth - 1);
+ return 0;
+}
+
+int
+main (int argc, char const *argv[])
+{
+ // If we have more than one argument, then it should a depth to recurse to.
+ // If we have just the program name as an argument, use UINT32_MAX so we
+ // eventually crash the program by overflowing the stack
+ uint32_t depth = UINT32_MAX;
+ if (argc > 1)
+ {
+ char *end = NULL;
+ depth = strtoul (argv[1], &end, 0);
+ if (end == NULL || *end != '\0')
+ depth = UINT32_MAX;
+ }
+ recurse_crash (depth);
+ return 0;
+} \ No newline at end of file
diff --git a/packages/Python/lldbsuite/test/lang/c/register_variables/Makefile b/packages/Python/lldbsuite/test/lang/c/register_variables/Makefile
new file mode 100644
index 000000000000..12e55616b540
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/register_variables/Makefile
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+C_SOURCES := test.c
+
+CFLAGS ?= -g -O1
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/register_variables/TestRegisterVariables.py b/packages/Python/lldbsuite/test/lang/c/register_variables/TestRegisterVariables.py
new file mode 100644
index 000000000000..7ef1f246bfd3
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/register_variables/TestRegisterVariables.py
@@ -0,0 +1,70 @@
+"""Check that compiler-generated register values work correctly"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class RegisterVariableTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureAll(oslist=['macosx'], compiler='clang', compiler_version=['<', '7.0.0'], debug_info="dsym")
+ @expectedFailureClang(None, ['<', '3.5'])
+ @expectedFailureGcc(None, ['is', '4.8.2'])
+ def test_and_run_command(self):
+ """Test expressions on register values."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the main.
+ lldbutil.run_break_set_by_source_regexp(self, "break", num_expected_locations=2)
+
+ ####################
+ # First breakpoint
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # Try some variables that should be visible
+ self.expect("expr a", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(int) $0 = 2'])
+
+ self.expect("expr b->m1", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(int) $1 = 3'])
+
+ #####################
+ # Second breakpoint
+
+ self.runCmd("continue")
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # Try some variables that should be visible
+ self.expect("expr b->m2", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(int) $2 = 5'])
+
+ self.expect("expr c", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(int) $3 = 5'])
+
+ self.runCmd("kill")
diff --git a/packages/Python/lldbsuite/test/lang/c/register_variables/test.c b/packages/Python/lldbsuite/test/lang/c/register_variables/test.c
new file mode 100644
index 000000000000..e467ac48f745
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/register_variables/test.c
@@ -0,0 +1,27 @@
+#include <stdio.h>
+
+struct bar {
+ int m1;
+ int m2;
+};
+
+void f1(int a, struct bar *b) __attribute__ ((noinline));
+void f1(int a, struct bar *b)
+{
+ b->m2 = b->m1 + a; // set breakpoint here
+}
+
+void f2(struct bar *b) __attribute__ ((noinline));
+void f2(struct bar *b)
+{
+ int c = b->m2;
+ printf("%d\n", c); // set breakpoint here
+}
+
+int main()
+{
+ struct bar myBar = { 3, 4 };
+ f1(2, &myBar);
+ f2(&myBar);
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/set_values/Makefile b/packages/Python/lldbsuite/test/lang/c/set_values/Makefile
new file mode 100644
index 000000000000..b09a579159d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/set_values/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/set_values/TestSetValues.py b/packages/Python/lldbsuite/test/lang/c/set_values/TestSetValues.py
new file mode 100644
index 000000000000..ab8102496091
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/set_values/TestSetValues.py
@@ -0,0 +1,111 @@
+"""Test settings and readings of program variables."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class SetValuesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.line1 = line_number('main.c', '// Set break point #1.')
+ self.line2 = line_number('main.c', '// Set break point #2.')
+ self.line3 = line_number('main.c', '// Set break point #3.')
+ self.line4 = line_number('main.c', '// Set break point #4.')
+ self.line5 = line_number('main.c', '// Set break point #5.')
+
+ @expectedFailureWindows("llvm.org/pr21765")
+ def test(self):
+ """Test settings and readings of program variables."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Set breakpoints on several places to set program variables.
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line1, num_expected_locations=1, loc_exact=True)
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line2, num_expected_locations=1, loc_exact=True)
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line3, num_expected_locations=1, loc_exact=True)
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line4, num_expected_locations=1, loc_exact=True)
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line5, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # main.c:15
+ # Check that 'frame variable --show-types' displays the correct data type and value.
+ self.expect("frame variable --show-types", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(char) i = 'a'")
+
+ # Now set variable 'i' and check that it is correctly displayed.
+ self.runCmd("expression i = 'b'")
+ self.expect("frame variable --show-types", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(char) i = 'b'")
+
+ self.runCmd("continue")
+
+ # main.c:36
+ # Check that 'frame variable --show-types' displays the correct data type and value.
+ self.expect("frame variable --show-types", VARIABLES_DISPLAYED_CORRECTLY,
+ patterns = ["\((short unsigned int|unsigned short)\) i = 33"])
+
+ # Now set variable 'i' and check that it is correctly displayed.
+ self.runCmd("expression i = 333")
+ self.expect("frame variable --show-types", VARIABLES_DISPLAYED_CORRECTLY,
+ patterns = ["\((short unsigned int|unsigned short)\) i = 333"])
+
+ self.runCmd("continue")
+
+ # main.c:57
+ # Check that 'frame variable --show-types' displays the correct data type and value.
+ self.expect("frame variable --show-types", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(long) i = 33")
+
+ # Now set variable 'i' and check that it is correctly displayed.
+ self.runCmd("expression i = 33333")
+ self.expect("frame variable --show-types", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(long) i = 33333")
+
+ self.runCmd("continue")
+
+ # main.c:78
+ # Check that 'frame variable --show-types' displays the correct data type and value.
+ self.expect("frame variable --show-types", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(double) i = 2.25")
+
+ # Now set variable 'i' and check that it is correctly displayed.
+ self.runCmd("expression i = 1.5")
+ self.expect("frame variable --show-types", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(double) i = 1.5")
+
+ self.runCmd("continue")
+
+ # main.c:85
+ # Check that 'frame variable --show-types' displays the correct data type and value.
+ self.expect("frame variable --show-types", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(long double) i = 2.25")
+
+ # Now set variable 'i' and check that it is correctly displayed.
+ self.runCmd("expression i = 1.5")
+ self.expect("frame variable --show-types", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(long double) i = 1.5")
diff --git a/packages/Python/lldbsuite/test/lang/c/set_values/main.c b/packages/Python/lldbsuite/test/lang/c/set_values/main.c
new file mode 100644
index 000000000000..64f01a97a286
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/set_values/main.c
@@ -0,0 +1,116 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdio.h>
+
+void set_char(void)
+{
+ char i = 'a';
+ printf("before (char) i = %c\n", i);
+ printf("after (char) i = %c\n", i); // Set break point #1. //// break $source:$line
+}
+
+void set_uchar(void)
+{
+ unsigned char i = 'a';
+ printf("before (unsigned char) i = %c\n", i);
+ printf("after (unsigned char) i = %c\n", i); //// break $source:$line
+}
+
+void set_short(void)
+{
+ short i = 33;
+ printf("before (short) i = %i\n", i);
+ printf("after (short) i = %i\n", i); //// break $source:$line
+}
+
+void set_ushort(void)
+{
+ unsigned short i = 33;
+ printf("before (unsigned short) i = %i\n", i);
+ printf("after (unsigned short) i = %i\n", i); // Set break point #2. //// break $source:$line
+}
+
+void set_int(void)
+{
+ int i = 33;
+ printf("before (int) i = %i\n", i);
+ printf("after (int) i = %i\n", i); //// break $source:$line
+}
+
+void set_uint(void)
+{
+ unsigned int i = 33;
+ printf("before (unsigned int) i = %u\n", i);
+ printf("after (unsigned int) i = %u\n", i); //// break $source:$line
+}
+
+void set_long(void)
+{
+ long i = 33;
+ printf("before (long) i = %li\n", i);
+ printf("after (long) i = %li\n", i); // Set break point #3. //// break $source:$line
+}
+
+void set_ulong(void)
+{
+ unsigned long i = 33;
+ printf("before (unsigned long) i = %lu\n", i);
+ printf("after (unsigned long) i = %lu\n", i); //// break $source:$line
+}
+
+void set_float(void)
+{
+ float i = 2.25;
+ printf("before (float) i = %g\n", i);
+ printf("after (float) i = %g\n", i); //// break $source:$line
+}
+
+void set_double(void)
+{
+ double i = 2.25;
+ printf("before (double) i = %g\n", i);
+ printf("after (double) i = %g\n", i); // Set break point #4. //// break $source:$line
+}
+
+void set_long_double(void)
+{
+ long double i = 2.25;
+ printf("before (long double) i = %Lg\n", i);
+ printf("after (long double) i = %Lg\n", i); // Set break point #5. //// break $source:$line
+}
+
+void set_point (void)
+{
+ struct point_tag {
+ int x;
+ int y;
+ };
+ struct point_tag points_2[2] = {
+ {1,2},
+ {3,4}
+ };
+}
+
+int main (int argc, char const *argv[])
+{
+ // Continue to the breakpoint in set_char()
+ set_char(); //// continue; var i; val -set 99 1
+ set_uchar(); //// continue; var i; val -set 99 2
+ set_short(); //// continue; var i; val -set -42 3
+ set_ushort(); //// continue; var i; val -set 42 4
+ set_int(); //// continue; var i; val -set -42 5
+ set_uint(); //// continue; var i; val -set 42 6
+ set_long(); //// continue; var i; val -set -42 7
+ set_ulong(); //// continue; var i; val -set 42 8
+ set_float(); //// continue; var i; val -set 123.456 9
+ set_double(); //// continue; var i; val -set 123.456 10
+ set_long_double(); //// continue; var i; val -set 123.456 11
+ set_point (); //// continue
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/shared_lib/Makefile b/packages/Python/lldbsuite/test/lang/c/shared_lib/Makefile
new file mode 100644
index 000000000000..854002e64708
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/shared_lib/Makefile
@@ -0,0 +1,8 @@
+LEVEL = ../../../make
+
+DYLIB_NAME := foo
+DYLIB_C_SOURCES := foo.c
+C_SOURCES := main.c
+CFLAGS_EXTRAS += -fPIC
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/shared_lib/TestSharedLib.py b/packages/Python/lldbsuite/test/lang/c/shared_lib/TestSharedLib.py
new file mode 100644
index 000000000000..954d1bac6362
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/shared_lib/TestSharedLib.py
@@ -0,0 +1,71 @@
+"""Test that types defined in shared libraries work correctly."""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class SharedLibTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_expr(self):
+ """Test that types work when defined in a shared library and forward-declared in the main executable"""
+ if "clang" in self.getCompiler() and "3.4" in self.getCompilerVersion():
+ self.skipTest("llvm.org/pr16214 -- clang emits partial DWARF for structures referenced via typedef")
+
+ self.build()
+ self.common_setup()
+
+ # This should display correctly.
+ self.expect("expression --show-types -- *my_foo_ptr", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["(foo)", "(sub_foo)", "other_element = 3"])
+
+ @unittest2.expectedFailure("rdar://problem/10704639")
+ def test_frame_variable(self):
+ """Test that types work when defined in a shared library and forward-declared in the main executable"""
+ self.build()
+ self.common_setup()
+
+ # This should display correctly.
+ self.expect("frame variable --show-types -- *my_foo_ptr", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["(foo)", "(sub_foo)", "other_element = 3"])
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.source = 'main.c'
+ self.line = line_number(self.source, '// Set breakpoint 0 here.')
+ self.shlib_names = ["foo"]
+
+ def common_setup(self):
+ # Run in synchronous mode
+ self.dbg.SetAsync(False)
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget("a.out")
+ self.assertTrue(target, VALID_TARGET)
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ lldbutil.run_break_set_by_file_and_line (self, self.source, self.line, num_expected_locations=1, loc_exact=True)
+
+ # Register our shared libraries for remote targets so they get automatically uploaded
+ environment = self.registerSharedLibrariesWithTarget(target, self.shlib_names)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, environment, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
diff --git a/packages/Python/lldbsuite/test/lang/c/shared_lib/foo.c b/packages/Python/lldbsuite/test/lang/c/shared_lib/foo.c
new file mode 100644
index 000000000000..6431bc496c30
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/shared_lib/foo.c
@@ -0,0 +1,22 @@
+#include "foo.h"
+#include <stdlib.h>
+
+struct foo
+{
+ struct sub_foo sub_element;
+ int other_element;
+};
+
+struct foo *
+GetMeAFoo()
+{
+ struct foo *ret_val = (struct foo *) malloc (sizeof (struct foo));
+ ret_val->other_element = 3;
+ return ret_val;
+}
+
+struct sub_foo *
+GetMeASubFoo (struct foo *in_foo)
+{
+ return &(in_foo->sub_element);
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/shared_lib/foo.h b/packages/Python/lldbsuite/test/lang/c/shared_lib/foo.h
new file mode 100644
index 000000000000..78b9e3f9c0d9
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/shared_lib/foo.h
@@ -0,0 +1,10 @@
+struct foo;
+
+struct sub_foo
+{
+ int sub_1;
+ char *sub_2;
+};
+
+LLDB_TEST_API struct foo *GetMeAFoo();
+LLDB_TEST_API struct sub_foo *GetMeASubFoo(struct foo *in_foo);
diff --git a/packages/Python/lldbsuite/test/lang/c/shared_lib/main.c b/packages/Python/lldbsuite/test/lang/c/shared_lib/main.c
new file mode 100644
index 000000000000..b4377de18c16
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/shared_lib/main.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include "foo.h"
+
+int
+main ()
+{
+ struct foo *my_foo_ptr;
+ my_foo_ptr = GetMeAFoo();
+
+ printf ("My sub foo has: %d.\n", GetMeASubFoo(my_foo_ptr)->sub_1); // Set breakpoint 0 here.
+
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/Makefile b/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/Makefile
new file mode 100644
index 000000000000..51347d73f09c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/Makefile
@@ -0,0 +1,10 @@
+LEVEL = ../../../make
+
+DYLIB_NAME := foo
+DYLIB_C_SOURCES := foo.c
+C_SOURCES := main.c
+CFLAGS_EXTRAS += -fPIC
+
+SPLIT_DEBUG_SYMBOLS = YES
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/TestSharedLibStrippedSymbols.py b/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/TestSharedLibStrippedSymbols.py
new file mode 100644
index 000000000000..a9cb46ca137b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/TestSharedLibStrippedSymbols.py
@@ -0,0 +1,73 @@
+"""Test that types defined in shared libraries with stripped symbols work correctly."""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class SharedLibStrippedTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureWindows # Test crashes
+ def test_expr(self):
+ """Test that types work when defined in a shared library and forward-declared in the main executable"""
+ if "clang" in self.getCompiler() and "3.4" in self.getCompilerVersion():
+ self.skipTest("llvm.org/pr16214 -- clang emits partial DWARF for structures referenced via typedef")
+
+ self.build()
+ self.common_setup()
+
+ # This should display correctly.
+ self.expect("expression --show-types -- *my_foo_ptr", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["(foo)", "(sub_foo)", "other_element = 3"])
+
+ @expectedFailureWindows # Test crashes
+ @unittest2.expectedFailure("rdar://problem/10381325")
+ def test_frame_variable(self):
+ """Test that types work when defined in a shared library and forward-declared in the main executable"""
+ self.build()
+ self.common_setup()
+
+ # This should display correctly.
+ self.expect("frame variable --show-types -- *my_foo_ptr", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["(foo)", "(sub_foo)", "other_element = 3"])
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.source = 'main.c'
+ self.line = line_number(self.source, '// Set breakpoint 0 here.')
+ self.shlib_names = ["foo"]
+
+ def common_setup(self):
+ # Run in synchronous mode
+ self.dbg.SetAsync(False)
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget("a.out")
+ self.assertTrue(target, VALID_TARGET)
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ lldbutil.run_break_set_by_file_and_line (self, self.source, self.line, num_expected_locations=1, loc_exact=True)
+
+ # Register our shared libraries for remote targets so they get automatically uploaded
+ environment = self.registerSharedLibrariesWithTarget(target, self.shlib_names)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, environment, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
diff --git a/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/foo.c b/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/foo.c
new file mode 100644
index 000000000000..6431bc496c30
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/foo.c
@@ -0,0 +1,22 @@
+#include "foo.h"
+#include <stdlib.h>
+
+struct foo
+{
+ struct sub_foo sub_element;
+ int other_element;
+};
+
+struct foo *
+GetMeAFoo()
+{
+ struct foo *ret_val = (struct foo *) malloc (sizeof (struct foo));
+ ret_val->other_element = 3;
+ return ret_val;
+}
+
+struct sub_foo *
+GetMeASubFoo (struct foo *in_foo)
+{
+ return &(in_foo->sub_element);
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/foo.h b/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/foo.h
new file mode 100644
index 000000000000..78b3c1245387
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/foo.h
@@ -0,0 +1,12 @@
+struct foo;
+
+struct sub_foo
+{
+ int sub_1;
+ char *sub_2;
+};
+
+struct foo *GetMeAFoo();
+struct sub_foo *GetMeASubFoo (struct foo *in_foo);
+
+
diff --git a/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/main.c b/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/main.c
new file mode 100644
index 000000000000..b4377de18c16
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/shared_lib_stripped_symbols/main.c
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include "foo.h"
+
+int
+main ()
+{
+ struct foo *my_foo_ptr;
+ my_foo_ptr = GetMeAFoo();
+
+ printf ("My sub foo has: %d.\n", GetMeASubFoo(my_foo_ptr)->sub_1); // Set breakpoint 0 here.
+
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/stepping/Makefile b/packages/Python/lldbsuite/test/lang/c/stepping/Makefile
new file mode 100644
index 000000000000..b09a579159d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/stepping/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/stepping/TestStepAndBreakpoints.py b/packages/Python/lldbsuite/test/lang/c/stepping/TestStepAndBreakpoints.py
new file mode 100644
index 000000000000..c7a3de4b6846
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/stepping/TestStepAndBreakpoints.py
@@ -0,0 +1,242 @@
+"""Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestCStepping(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def getCategories(self):
+ return ['basic_process']
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers that we will step to in main:
+ self.main_source = "main.c"
+
+ @expectedFailureFreeBSD('llvm.org/pr17932')
+ @expectedFailureLinux # llvm.org/pr14437
+ @expectedFailureWindows("llvm.org/pr24777")
+ @add_test_categories(['pyapi'])
+ def test_and_python_api(self):
+ """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ self.main_source_spec = lldb.SBFileSpec (self.main_source)
+
+ breakpoints_to_disable = []
+
+ break_1_in_main = target.BreakpointCreateBySourceRegex ('// frame select 2, thread step-out while stopped at .c.1..', self.main_source_spec)
+ self.assertTrue(break_1_in_main, VALID_BREAKPOINT)
+ breakpoints_to_disable.append (break_1_in_main)
+
+ break_in_a = target.BreakpointCreateBySourceRegex ('// break here to stop in a before calling b', self.main_source_spec)
+ self.assertTrue(break_in_a, VALID_BREAKPOINT)
+ breakpoints_to_disable.append (break_in_a)
+
+ break_in_b = target.BreakpointCreateBySourceRegex ('// thread step-out while stopped at .c.2..', self.main_source_spec)
+ self.assertTrue(break_in_b, VALID_BREAKPOINT)
+ breakpoints_to_disable.append (break_in_b)
+
+ break_in_c = target.BreakpointCreateBySourceRegex ('// Find the line number of function .c. here.', self.main_source_spec)
+ self.assertTrue(break_in_c, VALID_BREAKPOINT)
+ breakpoints_to_disable.append (break_in_c)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ threads = lldbutil.get_threads_stopped_at_breakpoint (process, break_1_in_main)
+
+ if len(threads) != 1:
+ self.fail ("Failed to stop at first breakpoint in main.")
+
+ thread = threads[0]
+
+ # Get the stop id and for fun make sure it increases:
+ old_stop_id = process.GetStopID()
+
+ # Now step over, which should cause us to hit the breakpoint in "a"
+ thread.StepOver()
+
+ # The stop reason of the thread should be breakpoint.
+ threads = lldbutil.get_threads_stopped_at_breakpoint (process, break_in_a)
+ if len(threads) != 1:
+ self.fail ("Failed to stop at breakpoint in a.")
+
+ # Check that the stop ID increases:
+ new_stop_id = process.GetStopID()
+ self.assertTrue(new_stop_id > old_stop_id, "Stop ID increases monotonically.")
+
+ thread = threads[0]
+
+ # Step over, and we should hit the breakpoint in b:
+ thread.StepOver()
+
+ threads = lldbutil.get_threads_stopped_at_breakpoint (process, break_in_b)
+ if len(threads) != 1:
+ self.fail ("Failed to stop at breakpoint in b.")
+ thread = threads[0]
+
+ # Now try running some function, and make sure that we still end up in the same place
+ # and with the same stop reason.
+ frame = thread.GetFrameAtIndex(0)
+ current_line = frame.GetLineEntry().GetLine()
+ current_file = frame.GetLineEntry().GetFileSpec()
+ current_bp = []
+ current_bp.append(thread.GetStopReasonDataAtIndex(0))
+ current_bp.append(thread.GetStopReasonDataAtIndex(1))
+
+ stop_id_before_expression = process.GetStopID()
+ stop_id_before_including_expressions = process.GetStopID(True)
+
+ frame.EvaluateExpression ("(int) printf (print_string)")
+
+ frame = thread.GetFrameAtIndex(0)
+ self.assertTrue (current_line == frame.GetLineEntry().GetLine(), "The line stayed the same after expression.")
+ self.assertTrue (current_file == frame.GetLineEntry().GetFileSpec(), "The file stayed the same after expression.")
+ self.assertTrue (thread.GetStopReason() == lldb.eStopReasonBreakpoint, "We still say we stopped for a breakpoint.")
+ self.assertTrue (thread.GetStopReasonDataAtIndex(0) == current_bp[0] and thread.GetStopReasonDataAtIndex(1) == current_bp[1], "And it is the same breakpoint.")
+
+ # Also make sure running the expression didn't change the public stop id
+ # but did change if we are asking for expression stops as well.
+ stop_id_after_expression = process.GetStopID()
+ stop_id_after_including_expressions = process.GetStopID(True)
+
+ self.assertTrue (stop_id_before_expression == stop_id_after_expression, "Expression calling doesn't change stop ID")
+
+ self.assertTrue (stop_id_after_including_expressions > stop_id_before_including_expressions, "Stop ID including expressions increments over expression call.")
+
+ # Do the same thing with an expression that's going to crash, and make sure we are still unchanged.
+
+ frame.EvaluateExpression ("((char *) 0)[0] = 'a'")
+
+ frame = thread.GetFrameAtIndex(0)
+ self.assertTrue (current_line == frame.GetLineEntry().GetLine(), "The line stayed the same after expression.")
+ self.assertTrue (current_file == frame.GetLineEntry().GetFileSpec(), "The file stayed the same after expression.")
+ self.assertTrue (thread.GetStopReason() == lldb.eStopReasonBreakpoint, "We still say we stopped for a breakpoint.")
+ self.assertTrue (thread.GetStopReasonDataAtIndex(0) == current_bp[0] and thread.GetStopReasonDataAtIndex(1) == current_bp[1], "And it is the same breakpoint.")
+
+ # Now continue and make sure we just complete the step:
+ # Disable all our breakpoints first - sometimes the compiler puts two line table entries in for the
+ # breakpoint a "b" and we don't want to hit that.
+ for bkpt in breakpoints_to_disable:
+ bkpt.SetEnabled(False)
+
+ process.Continue()
+
+ self.assertTrue (thread.GetFrameAtIndex(0).GetFunctionName() == "a")
+ self.assertTrue (thread.GetStopReason() == lldb.eStopReasonPlanComplete)
+
+ # And one more time should get us back to main:
+ process.Continue()
+
+ self.assertTrue (thread.GetFrameAtIndex(0).GetFunctionName() == "main")
+ self.assertTrue (thread.GetStopReason() == lldb.eStopReasonPlanComplete)
+
+ # Now make sure we can call a function, break in the called function, then have "continue" get us back out again:
+ frame = thread.GetFrameAtIndex(0)
+ frame = thread.GetFrameAtIndex(0)
+ current_line = frame.GetLineEntry().GetLine()
+ current_file = frame.GetLineEntry().GetFileSpec()
+
+ break_in_b.SetEnabled(True)
+ frame.EvaluateExpression ("b (4)", lldb.eNoDynamicValues, False)
+
+ threads = lldbutil.get_threads_stopped_at_breakpoint (process, break_in_b)
+ if len(threads) != 1:
+ self.fail ("Failed to stop at breakpoint in b when calling b.")
+ thread = threads[0]
+
+ # So do a step over here to make sure we can still do that:
+
+ thread.StepOver()
+
+ # See that we are still in b:
+ func_name = thread.GetFrameAtIndex(0).GetFunctionName()
+ self.assertTrue (func_name == "b", "Should be in 'b', were in %s"%(func_name))
+
+ # Okay, now if we continue, we will finish off our function call and we should end up back in "a" as if nothing had happened:
+ process.Continue ()
+
+ self.assertTrue (thread.GetFrameAtIndex(0).GetLineEntry().GetLine() == current_line)
+ self.assertTrue (thread.GetFrameAtIndex(0).GetLineEntry().GetFileSpec() == current_file)
+
+ # Now we are going to test step in targeting a function:
+
+ break_in_b.SetEnabled (False)
+
+ break_before_complex_1 = target.BreakpointCreateBySourceRegex ('// Stop here to try step in targeting b.', self.main_source_spec)
+ self.assertTrue(break_before_complex_1, VALID_BREAKPOINT)
+
+ break_before_complex_2 = target.BreakpointCreateBySourceRegex ('// Stop here to try step in targeting complex.', self.main_source_spec)
+ self.assertTrue(break_before_complex_2, VALID_BREAKPOINT)
+
+ break_before_complex_3 = target.BreakpointCreateBySourceRegex ('// Stop here to step targeting b and hitting breakpoint.', self.main_source_spec)
+ self.assertTrue(break_before_complex_3, VALID_BREAKPOINT)
+
+ break_before_complex_4 = target.BreakpointCreateBySourceRegex ('// Stop here to make sure bogus target steps over.', self.main_source_spec)
+ self.assertTrue(break_before_complex_4, VALID_BREAKPOINT)
+
+ threads = lldbutil.continue_to_breakpoint(process, break_before_complex_1)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+ break_before_complex_1.SetEnabled(False)
+
+ thread.StepInto ("b")
+ self.assertTrue (thread.GetFrameAtIndex(0).GetFunctionName() == "b")
+
+ # Now continue out and stop at the next call to complex. This time step all the way into complex:
+ threads = lldbutil.continue_to_breakpoint (process, break_before_complex_2)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+ break_before_complex_2.SetEnabled(False)
+
+ thread.StepInto ("complex")
+ self.assertTrue (thread.GetFrameAtIndex(0).GetFunctionName() == "complex")
+
+ # Now continue out and stop at the next call to complex. This time enable breakpoints in a and c and then step targeting b:
+ threads = lldbutil.continue_to_breakpoint (process, break_before_complex_3)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+ break_before_complex_3.SetEnabled(False)
+
+ break_at_start_of_a = target.BreakpointCreateByName ('a')
+ break_at_start_of_c = target.BreakpointCreateByName ('c')
+
+ thread.StepInto ("b")
+ threads = lldbutil.get_stopped_threads(process, lldb.eStopReasonBreakpoint);
+
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+ stop_break_id = thread.GetStopReasonDataAtIndex(0)
+ self.assertTrue(stop_break_id == break_at_start_of_a.GetID() or stop_break_id == break_at_start_of_c.GetID())
+
+ break_at_start_of_a.SetEnabled(False)
+ break_at_start_of_c.SetEnabled(False)
+
+ process.Continue()
+ self.assertTrue (thread.GetFrameAtIndex(0).GetFunctionName() == "b")
+
+ # Now continue out and stop at the next call to complex. This time enable breakpoints in a and c and then step targeting b:
+ threads = lldbutil.continue_to_breakpoint (process, break_before_complex_4)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+ break_before_complex_4.SetEnabled(False)
+
+ thread.StepInto("NoSuchFunction")
+ self.assertTrue (thread.GetFrameAtIndex(0).GetFunctionName() == "main")
diff --git a/packages/Python/lldbsuite/test/lang/c/stepping/TestThreadStepping.py b/packages/Python/lldbsuite/test/lang/c/stepping/TestThreadStepping.py
new file mode 100644
index 000000000000..c3ed3f933ab0
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/stepping/TestThreadStepping.py
@@ -0,0 +1,81 @@
+"""
+Test thread stepping features in combination with frame select.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class ThreadSteppingTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to of function 'c'.
+ self.line1 = line_number('main.c', '// Find the line number of function "c" here.')
+ self.line2 = line_number('main.c', '// frame select 2, thread step-out while stopped at "c(1)"')
+ self.line3 = line_number('main.c', '// thread step-out while stopped at "c(2)"')
+ self.line4 = line_number('main.c', '// frame select 1, thread step-out while stopped at "c(3)"')
+
+ def test_step_out_with_run_command(self):
+ """Exercise thread step-out and frame select followed by thread step-out."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Create a breakpoint inside function 'c'.
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", self.line1, num_expected_locations=1, loc_exact=True)
+
+ # Now run the program.
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The process should be stopped at this point.
+ self.expect("process status", PROCESS_STOPPED,
+ patterns = ['Process .* stopped'])
+
+ # The frame #0 should correspond to main.c:32, the executable statement
+ # in function name 'c'. And frame #3 should point to main.c:37.
+ self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ["stop reason = breakpoint"],
+ patterns = ["frame #0.*main.c:%d" % self.line1,
+ "frame #3.*main.c:%d" % self.line2])
+
+ # We want to move the pc to frame #3. This can be accomplished by
+ # 'frame select 2', followed by 'thread step-out'.
+ self.runCmd("frame select 2")
+ self.runCmd("thread step-out")
+ self.expect("thread backtrace", STEP_OUT_SUCCEEDED,
+ substrs = ["stop reason = step out"],
+ patterns = ["frame #0.*main.c:%d" % self.line2])
+
+ # Let's move on to a single step-out case.
+ self.runCmd("process continue")
+
+ # The process should be stopped at this point.
+ self.expect("process status", PROCESS_STOPPED,
+ patterns = ['Process .* stopped'])
+ self.runCmd("thread step-out")
+ self.expect("thread backtrace", STEP_OUT_SUCCEEDED,
+ substrs = ["stop reason = step out"],
+ patterns = ["frame #0.*main.c:%d" % self.line3])
+
+ # Do another frame selct, followed by thread step-out.
+ self.runCmd("process continue")
+
+ # The process should be stopped at this point.
+ self.expect("process status", PROCESS_STOPPED,
+ patterns = ['Process .* stopped'])
+ self.runCmd("frame select 1")
+ self.runCmd("thread step-out")
+ self.expect("thread backtrace", STEP_OUT_SUCCEEDED,
+ substrs = ["stop reason = step out"],
+ patterns = ["frame #0.*main.c:%d" % self.line4])
diff --git a/packages/Python/lldbsuite/test/lang/c/stepping/main.c b/packages/Python/lldbsuite/test/lang/c/stepping/main.c
new file mode 100644
index 000000000000..d8b4a2da761e
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/stepping/main.c
@@ -0,0 +1,69 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdio.h>
+
+int a(int);
+int b(int);
+int c(int);
+const char *print_string = "aaaaaaaaaa\n";
+
+int a(int val)
+{
+ int return_value = val; // basic break at the start of b
+
+ if (val <= 1)
+ {
+ return_value = b(val); // break here to stop in a before calling b
+ }
+ else if (val >= 3)
+ {
+ return_value = c(val);
+ }
+
+ return return_value;
+}
+
+int b(int val)
+{
+ int rc = c(val); // thread step-out while stopped at "c(2)"
+ return rc;
+}
+
+int c(int val)
+{
+ return val + 3; // Find the line number of function "c" here.
+}
+
+int complex (int first, int second, int third)
+{
+ return first + second + third; // Step in targeting complex should stop here
+}
+
+int main (int argc, char const *argv[])
+{
+ int A1 = a(1); // frame select 2, thread step-out while stopped at "c(1)"
+ printf("a(1) returns %d\n", A1);
+
+ int B2 = b(2);
+ printf("b(2) returns %d\n", B2);
+
+ int A3 = a(3); // frame select 1, thread step-out while stopped at "c(3)"
+ printf("a(3) returns %d\n", A3);
+
+ int A4 = complex (a(1), b(2), c(3)); // Stop here to try step in targeting b.
+
+ int A5 = complex (a(2), b(3), c(4)); // Stop here to try step in targeting complex.
+
+ int A6 = complex (a(4), b(5), c(6)); // Stop here to step targeting b and hitting breakpoint.
+
+ int A7 = complex (a(5), b(6), c(7)); // Stop here to make sure bogus target steps over.
+
+ printf ("I am using print_string: %s.\n", print_string);
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/strings/Makefile b/packages/Python/lldbsuite/test/lang/c/strings/Makefile
new file mode 100644
index 000000000000..b09a579159d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/strings/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/strings/TestCStrings.py b/packages/Python/lldbsuite/test/lang/c/strings/TestCStrings.py
new file mode 100644
index 000000000000..6f2a9ff03be0
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/strings/TestCStrings.py
@@ -0,0 +1,54 @@
+"""
+Tests that C strings work as expected in expressions
+"""
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class CStringsTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureWindows("llvm.org/pr21765")
+ def test_with_run_command(self):
+ """Tests that C strings work as expected in expressions"""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ line = line_number('main.c', '// breakpoint 1')
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("process launch", RUN_SUCCEEDED)
+
+ self.expect("expression -- a[2]",
+ patterns = ["\((const )?char\) \$0 = 'c'"])
+
+ self.expect("expression -- z[2]",
+ startstr = "(const char) $1 = 'x'")
+
+ # On Linux, the expression below will test GNU indirect function calls.
+ self.expect("expression -- (int)strlen(\"hello\")",
+ startstr = "(int) $2 = 5")
+
+ self.expect("expression -- \"world\"[2]",
+ startstr = "(const char) $3 = 'r'")
+
+ self.expect("expression -- \"\"[0]",
+ startstr = "(const char) $4 = '\\0'")
+
+ self.expect("expr --raw -- \"hello\"",
+ substrs = ['[0] = \'h\'',
+ '[5] = \'\\0\''])
+
+ self.expect("p \"hello\"",
+ substrs = ['[6]) $', 'hello'])
+
+ self.expect("p (char*)\"hello\"",
+ substrs = ['(char *) $', ' = 0x',
+ 'hello'])
+
+ self.expect("p (int)strlen(\"\")",
+ substrs = ['(int) $', ' = 0'])
+
+ self.expect("expression !z",
+ substrs = ['false'])
diff --git a/packages/Python/lldbsuite/test/lang/c/strings/main.c b/packages/Python/lldbsuite/test/lang/c/strings/main.c
new file mode 100644
index 000000000000..e02580b407f5
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/strings/main.c
@@ -0,0 +1,18 @@
+//===-- main.c ----------------------------------------------------*- C -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <stdio.h>
+
+int main()
+{
+ const char a[] = "abcde";
+ const char *z = "vwxyz";
+
+ printf("%s %s", a, z); // breakpoint 1
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/struct_types/Makefile b/packages/Python/lldbsuite/test/lang/c/struct_types/Makefile
new file mode 100644
index 000000000000..cd9ca5c86d84
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/struct_types/Makefile
@@ -0,0 +1,3 @@
+LEVEL = ../../../make
+C_SOURCES := main.c
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/struct_types/TestStructTypes.py b/packages/Python/lldbsuite/test/lang/c/struct_types/TestStructTypes.py
new file mode 100644
index 000000000000..87ad326f3181
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/struct_types/TestStructTypes.py
@@ -0,0 +1,4 @@
+import lldbsuite.test.lldbinline as lldbinline
+import lldbsuite.test.lldbtest as lldbtest
+
+lldbinline.MakeInlineTest(__file__, globals(), [lldbtest.expectedFailureWindows("llvm.org/pr24764")] )
diff --git a/packages/Python/lldbsuite/test/lang/c/struct_types/main.c b/packages/Python/lldbsuite/test/lang/c/struct_types/main.c
new file mode 100644
index 000000000000..29ac10cb94a8
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/struct_types/main.c
@@ -0,0 +1,43 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+struct things_to_sum {
+ int a;
+ int b;
+ int c;
+};
+
+int sum_things(struct things_to_sum tts)
+{
+ return tts.a + tts.b + tts.c;
+}
+
+int main (int argc, char const *argv[])
+{
+ struct point_tag {
+ int x;
+ int y;
+ char padding[0];
+ }; //% self.expect("frame variable pt.padding[0]", DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ["pt.padding[0] = "])
+ //% self.expect("frame variable pt.padding[1]", DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ["pt.padding[1] = "])
+ //% self.expect("expression -- (pt.padding[0])", DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ["(char)", " = "])
+ //% self.expect("image lookup -t point_tag", DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ['padding[]']) # Once rdar://problem/12566646 is fixed, this should display correctly
+
+ struct rect_tag {
+ struct point_tag bottom_left;
+ struct point_tag top_right;
+ };
+ struct point_tag pt = { 2, 3, {} };
+ struct rect_tag rect = {{1, 2, {}}, {3, 4, {}}};
+ struct things_to_sum tts = { 2, 3, 4 };
+
+ int sum = sum_things(tts); //% self.expect("expression -- &pt == (struct point_tag*)0", substrs = ['false'])
+ //% self.expect("expression -- sum_things(tts)", substrs = ['9'])
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/tls_globals/Makefile b/packages/Python/lldbsuite/test/lang/c/tls_globals/Makefile
new file mode 100644
index 000000000000..90affed8e3ad
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/tls_globals/Makefile
@@ -0,0 +1,11 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+CFLAGS_EXTRAS += -fPIC
+
+DYLIB_NAME := a
+DYLIB_C_SOURCES := a.c
+
+ENABLE_THREADS := YES
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/tls_globals/TestTlsGlobals.py b/packages/Python/lldbsuite/test/lang/c/tls_globals/TestTlsGlobals.py
new file mode 100644
index 000000000000..0d9e22ec3adf
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/tls_globals/TestTlsGlobals.py
@@ -0,0 +1,75 @@
+"""Test that thread-local storage can be read correctly."""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TlsGlobalTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ TestBase.setUp(self)
+
+ if self.getPlatform() == "freebsd" or self.getPlatform() == "linux":
+ # LD_LIBRARY_PATH must be set so the shared libraries are found on startup
+ if "LD_LIBRARY_PATH" in os.environ:
+ self.runCmd("settings set target.env-vars " + self.dylibPath + "=" + os.environ["LD_LIBRARY_PATH"] + ":" + os.getcwd())
+ else:
+ self.runCmd("settings set target.env-vars " + self.dylibPath + "=" + os.getcwd())
+ self.addTearDownHook(lambda: self.runCmd("settings remove target.env-vars " + self.dylibPath))
+
+ @unittest2.expectedFailure("rdar://7796742")
+ @skipIfWindows # TLS works differently on Windows, this would need to be implemented separately.
+ def test(self):
+ """Test thread-local storage."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ line1 = line_number('main.c', '// thread breakpoint')
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", line1, num_expected_locations=1, loc_exact=True)
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.runCmd("process status", "Get process status")
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # BUG: sometimes lldb doesn't change threads to the stopped thread.
+ # (unrelated to this test).
+ self.runCmd("thread select 2", "Change thread")
+
+ # Check that TLS evaluates correctly within the thread.
+ self.expect("expr var_static", VARIABLES_DISPLAYED_CORRECTLY,
+ patterns = ["\(int\) \$.* = 88"])
+ self.expect("expr var_shared", VARIABLES_DISPLAYED_CORRECTLY,
+ patterns = ["\(int\) \$.* = 66"])
+
+ # Continue on the main thread
+ line2 = line_number('main.c', '// main breakpoint')
+ lldbutil.run_break_set_by_file_and_line (self, "main.c", line2, num_expected_locations=1, loc_exact=True)
+ self.runCmd("continue", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.runCmd("process status", "Get process status")
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # BUG: sometimes lldb doesn't change threads to the stopped thread.
+ # (unrelated to this test).
+ self.runCmd("thread select 1", "Change thread")
+
+ # Check that TLS evaluates correctly within the main thread.
+ self.expect("expr var_static", VARIABLES_DISPLAYED_CORRECTLY,
+ patterns = ["\(int\) \$.* = 44"])
+ self.expect("expr var_shared", VARIABLES_DISPLAYED_CORRECTLY,
+ patterns = ["\(int\) \$.* = 33"])
diff --git a/packages/Python/lldbsuite/test/lang/c/tls_globals/a.c b/packages/Python/lldbsuite/test/lang/c/tls_globals/a.c
new file mode 100644
index 000000000000..b9a85902d117
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/tls_globals/a.c
@@ -0,0 +1,18 @@
+//===-- a.c -----------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <unistd.h>
+
+__thread int var_shared = 33;
+
+void shared_check()
+{
+ var_shared *= 2;
+ usleep(1); // shared thread breakpoint
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/tls_globals/main.c b/packages/Python/lldbsuite/test/lang/c/tls_globals/main.c
new file mode 100644
index 000000000000..cbe01b89b7ef
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/tls_globals/main.c
@@ -0,0 +1,36 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdio.h>
+#include <pthread.h>
+#include <unistd.h>
+
+void shared_check();
+
+// Create some TLS storage within the static executable.
+__thread int var_static = 44;
+
+void *fn_static(void *param)
+{
+ var_static *= 2;
+ shared_check();
+ usleep(1); // thread breakpoint
+ for(;;)
+ usleep(1);
+}
+
+int main (int argc, char const *argv[])
+{
+ pthread_t handle;
+ pthread_create(&handle, NULL, &fn_static, NULL);
+
+ for(;;)
+ usleep(1); // main breakpoint
+
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/c/typedef/Makefile b/packages/Python/lldbsuite/test/lang/c/typedef/Makefile
new file mode 100644
index 000000000000..b09a579159d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/typedef/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/c/typedef/Testtypedef.py b/packages/Python/lldbsuite/test/lang/c/typedef/Testtypedef.py
new file mode 100644
index 000000000000..a4870de1d177
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/typedef/Testtypedef.py
@@ -0,0 +1,40 @@
+"""Look up type information for typedefs of same name at different lexical scope and check for correct display."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TypedefTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureAll(bugnumber="llvm.org/pr19238", compiler="clang")
+ @expectedFailureAll(bugnumber="llvm.org/pr25626 expectedFailureClang fails on FreeBSD", oslist=["freebsd"])
+ def test_typedef(self):
+ """Test 'image lookup -t a' and check for correct display at different scopes."""
+ self.build()
+ self.image_lookup_for_multiple_typedefs()
+
+ def image_lookup_for_multiple_typedefs(self):
+ """Test 'image lookup -t a' at different scopes and check for correct display."""
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+ typearray = ("float", "float", "char", "double *", "float", "int", "double", "float", "float")
+ arraylen = len(typearray)+1
+ for i in range(1,arraylen):
+ loc_line = line_number('main.c', '// Set break point ' + str(i) + '.')
+ lldbutil.run_break_set_by_file_and_line (self, "main.c",loc_line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ for t in typearray:
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped', 'stop reason = breakpoint'])
+ self.expect("image lookup -t a", DATA_TYPES_DISPLAYED_CORRECTLY,
+ substrs = ['name = "' + t + '"'])
+ self.runCmd("continue")
diff --git a/packages/Python/lldbsuite/test/lang/c/typedef/main.c b/packages/Python/lldbsuite/test/lang/c/typedef/main.c
new file mode 100644
index 000000000000..62f8a00e6644
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/c/typedef/main.c
@@ -0,0 +1,46 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+void test()
+{
+ typedef double * a;
+ a b = 0; // Set break point 4.
+}
+int main (int argc, char const *argv[])
+{
+ typedef float a;
+ int i = 0; // Set break point 1.
+ i++;
+ a floatvariable = 2.7; // Set break point 2.
+ {
+ typedef char a;
+ i++;
+ a charvariable = 'a'; // Set break point 3.
+ test();
+ }
+ {
+ int c = 0;
+ c++; // Set break point 5.
+ for(i = 0 ; i < 1 ; i++)
+ {
+ typedef int a;
+ a b;
+ b = 7; // Set break point 6.
+ }
+ for(i = 0 ; i < 1 ; i++)
+ {
+ typedef double a;
+ a b;
+ b = 3.14; // Set break point 7.
+ }
+ c = 1; // Set break point 8.
+ }
+ floatvariable = 2.5;
+ floatvariable = 2.8; // Set break point 9.
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/auto/Makefile b/packages/Python/lldbsuite/test/lang/cpp/auto/Makefile
new file mode 100644
index 000000000000..194af7b32398
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/auto/Makefile
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+CFLAGS_EXTRAS += $(NO_LIMIT_DEBUG_INFO_FLAGS)
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/auto/TestCPPAuto.py b/packages/Python/lldbsuite/test/lang/cpp/auto/TestCPPAuto.py
new file mode 100644
index 000000000000..9746dec2fa3d
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/auto/TestCPPAuto.py
@@ -0,0 +1,25 @@
+"""
+Tests that auto types work
+"""
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class CPPAutoTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureGcc("GCC does not generate complete debug info")
+ def test_with_run_command(self):
+ """Test that auto types work in the expression parser"""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ line = line_number('main.cpp', '// break here')
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", line, num_expected_locations=-1, loc_exact=False)
+
+ self.runCmd("process launch", RUN_SUCCEEDED)
+
+ self.expect('expr auto f = 123456; f', substrs=['int', '123456'])
+ self.expect('expr struct Test { int x; int y; Test() : x(123), y(456) {} }; auto t = Test(); t', substrs=['Test', '123', '456'])
+ self.expect('expr auto s = helloworld; s', substrs=['string', 'hello world'])
diff --git a/packages/Python/lldbsuite/test/lang/cpp/auto/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/auto/main.cpp
new file mode 100644
index 000000000000..76fb95e0a34c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/auto/main.cpp
@@ -0,0 +1,16 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <string>
+
+int main()
+{
+ std::string helloworld("hello world");
+ return 0; // break here
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/bool/Makefile b/packages/Python/lldbsuite/test/lang/cpp/bool/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/bool/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/bool/TestCPPBool.py b/packages/Python/lldbsuite/test/lang/cpp/bool/TestCPPBool.py
new file mode 100644
index 000000000000..ef7135cfaa07
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/bool/TestCPPBool.py
@@ -0,0 +1,26 @@
+"""
+Tests that bool types work
+"""
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class CPPBoolTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_with_run_command(self):
+ """Test that bool types work in the expression parser"""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ line = line_number('main.cpp', '// breakpoint 1')
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", line, num_expected_locations=-1, loc_exact=False)
+
+ self.runCmd("process launch", RUN_SUCCEEDED)
+
+ self.expect("expression -- bool second_bool = my_bool; second_bool",
+ startstr = "(bool) $0 = false")
+
+ self.expect("expression -- my_bool = true",
+ startstr = "(bool) $1 = true")
diff --git a/packages/Python/lldbsuite/test/lang/cpp/bool/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/bool/main.cpp
new file mode 100644
index 000000000000..88d02d5b2894
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/bool/main.cpp
@@ -0,0 +1,17 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <stdio.h>
+
+int main()
+{
+ bool my_bool = false;
+
+ printf("%s\n", my_bool ? "true" : "false"); // breakpoint 1
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/Makefile b/packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/Makefile
new file mode 100644
index 000000000000..1d1f38f7fd0e
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := nested.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/TestCPPBreakpointCommands.py b/packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/TestCPPBreakpointCommands.py
new file mode 100644
index 000000000000..6c06f3750d13
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/TestCPPBreakpointCommands.py
@@ -0,0 +1,84 @@
+"""
+Test lldb breakpoint command for CPP methods & functions in a namespace.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+
+class CPPBreakpointCommandsTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureWindows
+ def test(self):
+ """Test a sequence of breakpoint command add, list, and delete."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target from the debugger.
+
+ target = self.dbg.CreateTarget (exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ a_out_module = lldb.SBFileSpecList()
+ a_out_module.Append(lldb.SBFileSpec(exe))
+
+ nested_comp_unit = lldb.SBFileSpecList()
+ nested_comp_unit.Append (lldb.SBFileSpec("nested.cpp"))
+
+ # First provide ONLY the method name. This should get everybody...
+ auto_break = target.BreakpointCreateByName ("Function",
+ lldb.eFunctionNameTypeAuto,
+ a_out_module,
+ nested_comp_unit)
+ self.assertTrue (auto_break.GetNumLocations() == 5)
+
+ # Now add the Baz class specifier. This should get the version contained in Bar,
+ # AND the one contained in ::
+ auto_break = target.BreakpointCreateByName ("Baz::Function",
+ lldb.eFunctionNameTypeAuto,
+ a_out_module,
+ nested_comp_unit)
+ self.assertTrue (auto_break.GetNumLocations() == 2)
+
+ # Then add the Bar::Baz specifier. This should get the version contained in Bar only
+ auto_break = target.BreakpointCreateByName ("Bar::Baz::Function",
+ lldb.eFunctionNameTypeAuto,
+ a_out_module,
+ nested_comp_unit)
+ self.assertTrue (auto_break.GetNumLocations() == 1)
+
+ plain_method_break = target.BreakpointCreateByName ("Function",
+ lldb.eFunctionNameTypeMethod,
+ a_out_module,
+ nested_comp_unit)
+ self.assertTrue (plain_method_break.GetNumLocations() == 3)
+
+ plain_method_break = target.BreakpointCreateByName ("Baz::Function",
+ lldb.eFunctionNameTypeMethod,
+ a_out_module,
+ nested_comp_unit)
+ self.assertTrue (plain_method_break.GetNumLocations() == 2)
+
+ plain_method_break = target.BreakpointCreateByName ("Bar::Baz::Function",
+ lldb.eFunctionNameTypeMethod,
+ a_out_module,
+ nested_comp_unit)
+ self.assertTrue (plain_method_break.GetNumLocations() == 1)
+
+ plain_method_break = target.BreakpointCreateByName ("Function",
+ lldb.eFunctionNameTypeBase,
+ a_out_module,
+ nested_comp_unit)
+ self.assertTrue (plain_method_break.GetNumLocations() == 2)
+
+ plain_method_break = target.BreakpointCreateByName ("Bar::Function",
+ lldb.eFunctionNameTypeBase,
+ a_out_module,
+ nested_comp_unit)
+ self.assertTrue (plain_method_break.GetNumLocations() == 1)
diff --git a/packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/nested.cpp b/packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/nested.cpp
new file mode 100644
index 000000000000..29d4b4cb19e7
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/breakpoint-commands/nested.cpp
@@ -0,0 +1,76 @@
+#include <stdio.h>
+
+namespace Foo
+{
+ namespace Bar
+ {
+ class Baz
+ {
+ public:
+ Baz (int value):m_value(value) {}
+ int Function ()
+ {
+ printf ("%s returning: %d.\n", __FUNCTION__, m_value);
+ return m_value;
+ }
+ private:
+ int m_value;
+ };
+
+ class Baz2
+ {
+ public:
+ Baz2 (int value):m_value(value) {}
+ int Function ()
+ {
+ printf ("%s returning: %d.\n", __FUNCTION__, m_value);
+ return m_value;
+ }
+ private:
+ int m_value;
+ };
+
+ static int bar_value = 20;
+ int Function ()
+ {
+ printf ("%s returning: %d.\n", __FUNCTION__, bar_value);
+ return bar_value;
+ }
+ }
+}
+
+class Baz
+{
+public:
+ Baz (int value):m_value(value) {}
+ int Function ()
+ {
+ printf ("%s returning: %d.\n", __FUNCTION__, m_value);
+ return m_value;
+ }
+private:
+ int m_value;
+};
+
+int
+Function ()
+{
+ printf ("I am a global function, I return 333.\n");
+ return 333;
+}
+
+int main ()
+{
+ Foo::Bar::Baz mine(200);
+ Foo::Bar::Baz2 mine2(300);
+ ::Baz bare_baz (500);
+
+ printf ("Yup, got %d from Baz.\n", mine.Function());
+ printf ("Yup, got %d from Baz.\n", mine2.Function());
+ printf ("Yup, got %d from Baz.\n", bare_baz.Function());
+ printf ("And got %d from Bar.\n", Foo::Bar::Function());
+ printf ("And got %d from ::.\n", ::Function());
+
+ return 0;
+
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/call-function/Makefile b/packages/Python/lldbsuite/test/lang/cpp/call-function/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/call-function/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/call-function/TestCallCPPFunction.py b/packages/Python/lldbsuite/test/lang/cpp/call-function/TestCallCPPFunction.py
new file mode 100644
index 000000000000..3aa97af68819
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/call-function/TestCallCPPFunction.py
@@ -0,0 +1,33 @@
+"""
+Tests calling a function by basename
+"""
+
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class CallCPPFunctionTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ TestBase.setUp(self)
+ self.line = line_number('main.cpp', '// breakpoint')
+
+ @expectedFailureWindows("llvm.org/pr24489: Name lookup not working correctly on Windows")
+ def test_with_run_command(self):
+ """Test calling a function by basename"""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("process launch", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list",
+ STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped', 'stop reason = breakpoint'])
+
+ self.expect("expression -- a_function_to_call()",
+ startstr = "(int) $0 = 0")
diff --git a/packages/Python/lldbsuite/test/lang/cpp/call-function/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/call-function/main.cpp
new file mode 100644
index 000000000000..61a5e9d21abb
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/call-function/main.cpp
@@ -0,0 +1,11 @@
+#include <stdio.h>
+
+int a_function_to_call()
+{
+ return 0;
+}
+
+int main()
+{
+ printf("%d\n", a_function_to_call()); // breakpoint
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/chained-calls/Makefile b/packages/Python/lldbsuite/test/lang/cpp/chained-calls/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/chained-calls/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/chained-calls/TestCppChainedCalls.py b/packages/Python/lldbsuite/test/lang/cpp/chained-calls/TestCppChainedCalls.py
new file mode 100644
index 000000000000..272665a78577
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/chained-calls/TestCppChainedCalls.py
@@ -0,0 +1,73 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TestCppChainedCalls(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureWindows("llvm.org/pr21765")
+ def test_with_run_command(self):
+ self.build()
+
+ # Get main source file
+ src_file = "main.cpp"
+ src_file_spec = lldb.SBFileSpec(src_file)
+ self.assertTrue(src_file_spec.IsValid(), "Main source file")
+
+ # Get the path of the executable
+ cwd = os.getcwd()
+ exe_file = "a.out"
+ exe_path = os.path.join(cwd, exe_file)
+
+ # Load the executable
+ target = self.dbg.CreateTarget(exe_path)
+ self.assertTrue(target.IsValid(), VALID_TARGET)
+
+ # Break on main function
+ main_breakpoint = target.BreakpointCreateBySourceRegex("break here", src_file_spec)
+ self.assertTrue(main_breakpoint.IsValid() and main_breakpoint.GetNumLocations() >= 1, VALID_BREAKPOINT)
+
+ # Launch the process
+ args = None
+ env = None
+ process = target.LaunchSimple(args, env, self.get_process_working_directory())
+ self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
+
+ # Get the thread of the process
+ self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
+ thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+
+ # Get frame for current thread
+ frame = thread.GetSelectedFrame()
+
+ # Test chained calls
+ test_result = frame.EvaluateExpression("get(set(true))")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "true", "get(set(true)) = true")
+
+ test_result = frame.EvaluateExpression("get(set(false))")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "false", "get(set(false)) = false")
+
+ test_result = frame.EvaluateExpression("get(t & f)")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "false", "get(t & f) = false")
+
+ test_result = frame.EvaluateExpression("get(f & t)")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "false", "get(f & t) = false")
+
+ test_result = frame.EvaluateExpression("get(t & t)")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "true", "get(t & t) = true")
+
+ test_result = frame.EvaluateExpression("get(f & f)")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "false", "get(f & f) = false")
+
+ test_result = frame.EvaluateExpression("get(t & f)")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "false", "get(t & f) = false")
+
+ test_result = frame.EvaluateExpression("get(f) && get(t)")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "false", "get(f) && get(t) = false")
+
+ test_result = frame.EvaluateExpression("get(f) && get(f)")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "false", "get(f) && get(t) = false")
+
+ test_result = frame.EvaluateExpression("get(t) && get(t)")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "true", "get(t) && get(t) = true")
diff --git a/packages/Python/lldbsuite/test/lang/cpp/chained-calls/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/chained-calls/main.cpp
new file mode 100644
index 000000000000..a888c3f6c557
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/chained-calls/main.cpp
@@ -0,0 +1,33 @@
+class Bool {
+public:
+ Bool operator&(const Bool other)
+ {
+ Bool result;
+ result.value = value && other.value;
+ return result;
+ }
+
+ bool value;
+};
+
+bool get(Bool object)
+{
+ return object.value;
+}
+
+Bool set(bool value)
+{
+ Bool result;
+ result.value = value;
+ return result;
+}
+
+int main()
+{
+ Bool t = set(true);
+ Bool f = set(false);
+ get(t);
+ get(f);
+ get(t & f);
+ return 0; // break here
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/char1632_t/.categories b/packages/Python/lldbsuite/test/lang/cpp/char1632_t/.categories
new file mode 100644
index 000000000000..fe1da0247c62
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/char1632_t/.categories
@@ -0,0 +1 @@
+dataformatters
diff --git a/packages/Python/lldbsuite/test/lang/cpp/char1632_t/Makefile b/packages/Python/lldbsuite/test/lang/cpp/char1632_t/Makefile
new file mode 100644
index 000000000000..932046f26968
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/char1632_t/Makefile
@@ -0,0 +1,8 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+CFLAGS :=-g -O0 -std=c++11
+
+clean: OBJECTS+=$(wildcard main.d.*)
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/char1632_t/TestChar1632T.py b/packages/Python/lldbsuite/test/lang/cpp/char1632_t/TestChar1632T.py
new file mode 100644
index 000000000000..9bb1faf4ba6d
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/char1632_t/TestChar1632T.py
@@ -0,0 +1,90 @@
+# coding=utf8
+"""
+Test that the C++11 support for char16_t and char32_t works correctly.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class Char1632TestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break for main.cpp.
+ self.source = 'main.cpp'
+ self.lines = [ line_number(self.source, '// breakpoint1'),
+ line_number(self.source, '// breakpoint2') ]
+
+ @expectedFailureIcc # ICC (13.1) does not emit the DW_TAG_base_type for char16_t and char32_t.
+ @expectedFailureWindows("llvm.org/pr24489: Name lookup not working correctly on Windows")
+ def test(self):
+ """Test that the C++11 support for char16_t and char32_t works correctly."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Set breakpoints
+ for line in self.lines:
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", line)
+
+ # Now launch the process, and do not stop at entry point and stop at breakpoint1
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ if not process:
+ self.fail("SBTarget.Launch() failed")
+
+ if self.TraceOn():
+ self.runCmd("frame variable")
+
+ # Check that we correctly report the const types
+ self.expect("frame variable cs16 cs32",
+ substrs = ['(const char16_t *) cs16 = ','(const char32_t *) cs32 = ','u"hello world ྒྙྐ"','U"hello world ྒྙྐ"'])
+
+ # Check that we correctly report the non-const types
+ self.expect("frame variable s16 s32",
+ substrs = ['(char16_t *) s16 = ','(char32_t *) s32 = ','u"ﺸﺵۻ"','U"ЕЙРГЖО"'])
+
+ # Check that we correctly report the array types
+ self.expect("frame variable as16 as32",
+ patterns = ['\(char16_t \[[0-9]+\]\) as16 = ', '\(char32_t \[[0-9]+\]\) as32 = '],
+ substrs = ['u"ﺸﺵۻ"','U"ЕЙРГЖО"'])
+
+ self.runCmd("next") # step to after the string is nullified
+
+ # check that we don't crash on NULL
+ self.expect("frame variable s32",
+ substrs = ['(char32_t *) s32 = 0x00000000'])
+
+ # continue and hit breakpoint2
+ self.runCmd("continue")
+
+ # check that the new strings show
+ self.expect("frame variable s16 s32",
+ substrs = ['(char16_t *) s16 = 0x','(char32_t *) s32 = ','"色ハ匂ヘト散リヌルヲ"','"෴"'])
+
+ # check the same as above for arrays
+ self.expect("frame variable as16 as32",
+ patterns = ['\(char16_t \[[0-9]+\]\) as16 = ', '\(char32_t \[[0-9]+\]\) as32 = '],
+ substrs = ['"色ハ匂ヘト散リヌルヲ"','"෴"'])
+
+ # check that zero values are properly handles
+ self.expect('frame variable cs16_zero', substrs=["U+0000 u'\\0'"])
+ self.expect('frame variable cs32_zero', substrs=["U+0x00000000 U'\\0'"])
+ self.expect('expression cs16_zero', substrs=["U+0000 u'\\0'"])
+ self.expect('expression cs32_zero', substrs=["U+0x00000000 U'\\0'"])
+
+ # Check that we can run expressions that return charN_t
+ self.expect("expression u'a'",substrs = ['(char16_t) $',"61 u'a'"])
+ self.expect("expression U'a'",substrs = ['(char32_t) $',"61 U'a'"])
diff --git a/packages/Python/lldbsuite/test/lang/cpp/char1632_t/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/char1632_t/main.cpp
new file mode 100644
index 000000000000..b92c2d572923
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/char1632_t/main.cpp
@@ -0,0 +1,44 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <assert.h>
+#include <string>
+
+#define UASZ 64
+
+template<class T, int N>
+void copy_char_seq (T (&arr)[N], const T* src)
+{
+ size_t src_len = std::char_traits<T>::length(src);
+ assert(src_len < N);
+
+ std::char_traits<T>::copy(arr, src, src_len);
+ arr[src_len] = 0;
+}
+
+int main (int argc, char const *argv[])
+{
+ char16_t as16[UASZ];
+ char32_t as32[UASZ];
+ auto cs16_zero = (char16_t)0;
+ auto cs32_zero = (char32_t)0;
+ auto cs16 = u"hello world ྒྙྐ";
+ auto cs32 = U"hello world ྒྙྐ";
+ char16_t *s16 = (char16_t *)u"ﺸﺵۻ";
+ char32_t *s32 = (char32_t *)U"ЕЙРГЖО";
+ copy_char_seq(as16, s16);
+ copy_char_seq(as32, s32);
+ s32 = nullptr; // breakpoint1
+ s32 = (char32_t *)U"෴";
+ s16 = (char16_t *)u"色ハ匂ヘト散リヌルヲ";
+ copy_char_seq(as16, s16);
+ copy_char_seq(as32, s32);
+ s32 = nullptr; // breakpoint2
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/class_static/Makefile b/packages/Python/lldbsuite/test/lang/cpp/class_static/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/class_static/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/class_static/TestStaticVariables.py b/packages/Python/lldbsuite/test/lang/cpp/class_static/TestStaticVariables.py
new file mode 100644
index 000000000000..d47d1b7dde41
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/class_static/TestStaticVariables.py
@@ -0,0 +1,120 @@
+"""
+Test display and Python APIs on file and class static variables.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class StaticVariableTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break at.
+ self.line = line_number('main.cpp', '// Set break point at this line.')
+
+ @expectedFailureWindows("llvm.org/pr24764")
+ def test_with_run_command(self):
+ """Test that file and class static variables display correctly."""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # global variables are no longer displayed with the "frame variable" command.
+ self.expect('target variable A::g_points', VARIABLES_DISPLAYED_CORRECTLY,
+ patterns=['\(PointType \[[1-9]*\]\) A::g_points = {.*}'])
+ self.expect('target variable g_points', VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['(PointType [2]) g_points'])
+
+ # On Mac OS X, gcc 4.2 emits the wrong debug info for A::g_points.
+ # A::g_points is an array of two elements.
+ if self.platformIsDarwin() or self.getPlatform() == "linux":
+ self.expect("target variable A::g_points[1].x", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(int) A::g_points[1].x = 11")
+
+ @expectedFailureDarwin(9980907)
+ @expectedFailureClang('Clang emits incomplete debug info.')
+ @expectedFailureFreeBSD('llvm.org/pr20550 failing on FreeBSD-11')
+ @expectedFailureGcc('GCC emits incomplete debug info.')
+ @add_test_categories(['pyapi'])
+ def test_with_python_api(self):
+ """Test Python APIs on file and class static variables."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ breakpoint = target.BreakpointCreateByLocation("main.cpp", self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread = process.GetThreadAtIndex(0)
+ if thread.GetStopReason() != lldb.eStopReasonBreakpoint:
+ from lldbsuite.test.lldbutil import stop_reason_to_str
+ self.fail(STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS %
+ stop_reason_to_str(thread.GetStopReason()))
+
+ # Get the SBValue of 'A::g_points' and 'g_points'.
+ frame = thread.GetFrameAtIndex(0)
+
+ # arguments => False
+ # locals => False
+ # statics => True
+ # in_scope_only => False
+ valList = frame.GetVariables(False, False, True, False)
+
+ for val in valList:
+ self.DebugSBValue(val)
+ name = val.GetName()
+ self.assertTrue(name in ['g_points', 'A::g_points'])
+ if name == 'g_points':
+ self.assertTrue(val.GetValueType() == lldb.eValueTypeVariableStatic)
+ self.assertTrue(val.GetNumChildren() == 2)
+ elif name == 'A::g_points':
+ self.assertTrue(val.GetValueType() == lldb.eValueTypeVariableGlobal)
+ self.assertTrue(val.GetNumChildren() == 2)
+ child1 = val.GetChildAtIndex(1)
+ self.DebugSBValue(child1)
+ child1_x = child1.GetChildAtIndex(0)
+ self.DebugSBValue(child1_x)
+ self.assertTrue(child1_x.GetTypeName() == 'int' and
+ child1_x.GetValue() == '11')
+
+ # SBFrame.FindValue() should also work.
+ val = frame.FindValue("A::g_points", lldb.eValueTypeVariableGlobal)
+ self.DebugSBValue(val)
+ self.assertTrue(val.GetName() == 'A::g_points')
+
+ # Also exercise the "parameter" and "local" scopes while we are at it.
+ val = frame.FindValue("argc", lldb.eValueTypeVariableArgument)
+ self.DebugSBValue(val)
+ self.assertTrue(val.GetName() == 'argc')
+
+ val = frame.FindValue("argv", lldb.eValueTypeVariableArgument)
+ self.DebugSBValue(val)
+ self.assertTrue(val.GetName() == 'argv')
+
+ val = frame.FindValue("hello_world", lldb.eValueTypeVariableLocal)
+ self.DebugSBValue(val)
+ self.assertTrue(val.GetName() == 'hello_world')
diff --git a/packages/Python/lldbsuite/test/lang/cpp/class_static/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/class_static/main.cpp
new file mode 100644
index 000000000000..2068eadcac5f
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/class_static/main.cpp
@@ -0,0 +1,53 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// I made this example after noting that I was unable to display an unsized
+// static class array. It turns out that gcc 4.2 will emit DWARF that correctly
+// describes the PointType, but it will incorrectly emit debug info for the
+// "g_points" array where the following things are wrong:
+// - the DW_TAG_array_type won't have a subrange info
+// - the DW_TAG_variable for "g_points" won't have a valid byte size, so even
+// though we know the size of PointType, we can't infer the actual size
+// of the array by dividing the size of the variable by the number of
+// elements.
+
+#include <stdio.h>
+
+typedef struct PointType
+{
+ int x, y;
+} PointType;
+
+class A
+{
+public:
+ static PointType g_points[];
+};
+
+PointType A::g_points[] =
+{
+ { 1, 2 },
+ { 11, 22 }
+};
+
+static PointType g_points[] =
+{
+ { 3, 4 },
+ { 33, 44 }
+};
+
+int
+main (int argc, char const *argv[])
+{
+ const char *hello_world = "Hello, world!";
+ printf ("A::g_points[1].x = %i\n", A::g_points[1].x); // Set break point at this line.
+ printf ("::g_points[1].x = %i\n", g_points[1].x);
+ printf ("%s\n", hello_world);
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/class_types/Makefile b/packages/Python/lldbsuite/test/lang/cpp/class_types/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/class_types/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/class_types/TestClassTypes.py b/packages/Python/lldbsuite/test/lang/cpp/class_types/TestClassTypes.py
new file mode 100644
index 000000000000..b67e53c30745
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/class_types/TestClassTypes.py
@@ -0,0 +1,215 @@
+"""Test breakpoint on a class constructor; and variable list the this object."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class ClassTypesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break for main.cpp.
+ self.line = line_number('main.cpp', '// Set break point at this line.')
+
+ def test_with_run_command(self):
+ """Test 'frame variable this' when stopped on a class constructor."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break on the ctor function of class C.
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The test suite sometimes shows that the process has exited without stopping.
+ #
+ # CC=clang ./dotest.py -v -t class_types
+ # ...
+ # Process 76604 exited with status = 0 (0x00000000)
+ self.runCmd("process status")
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # We should be stopped on the ctor function of class C.
+ self.expect("frame variable --show-types this", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['C *',
+ ' this = '])
+
+ @add_test_categories(['pyapi'])
+ def test_with_python_api(self):
+ """Use Python APIs to create a breakpoint by (filespec, line)."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ filespec = target.GetExecutable()
+ self.assertTrue(filespec, VALID_FILESPEC)
+
+ fsDir = os.path.normpath(filespec.GetDirectory())
+ fsFile = filespec.GetFilename()
+
+ self.assertTrue(fsDir == os.getcwd() and fsFile == "a.out",
+ "FileSpec matches the executable")
+
+ bpfilespec = lldb.SBFileSpec("main.cpp", False)
+
+ breakpoint = target.BreakpointCreateByLocation(bpfilespec, self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ # Verify the breakpoint just created.
+ self.expect(str(breakpoint), BREAKPOINT_CREATED, exe=False,
+ substrs = ['main.cpp',
+ str(self.line)])
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ if not process:
+ self.fail("SBTarget.Launch() failed")
+
+ if process.GetState() != lldb.eStateStopped:
+ self.fail("Process should be in the 'stopped' state, "
+ "instead the actual state is: '%s'" %
+ lldbutil.state_type_to_str(process.GetState()))
+
+ # The stop reason of the thread should be breakpoint.
+ thread = process.GetThreadAtIndex(0)
+ if thread.GetStopReason() != lldb.eStopReasonBreakpoint:
+ from lldbsuite.test.lldbutil import stop_reason_to_str
+ self.fail(STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS %
+ stop_reason_to_str(thread.GetStopReason()))
+
+ # The filename of frame #0 should be 'main.cpp' and the line number
+ # should be 93.
+ self.expect("%s:%d" % (lldbutil.get_filenames(thread)[0],
+ lldbutil.get_line_numbers(thread)[0]),
+ "Break correctly at main.cpp:%d" % self.line, exe=False,
+ startstr = "main.cpp:")
+ ### clang compiled code reported main.cpp:94?
+ ### startstr = "main.cpp:93")
+
+ # We should be stopped on the breakpoint with a hit count of 1.
+ self.assertTrue(breakpoint.GetHitCount() == 1, BREAKPOINT_HIT_ONCE)
+
+ process.Continue()
+
+ def test_with_expr_parser(self):
+ """Test 'frame variable this' and 'expr this' when stopped inside a constructor."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # rdar://problem/8516141
+ # Is this a case of clang (116.1) generating bad debug info?
+ #
+ # Break on the ctor function of class C.
+ #self.expect("breakpoint set -M C", BREAKPOINT_CREATED,
+ # startstr = "Breakpoint created: 1: name = 'C'")
+
+ # Make the test case more robust by using line number to break, instead.
+ lldbutil.run_break_set_by_file_and_line (self, None, self.line, num_expected_locations=-1)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # Continue on inside the ctor() body...
+ self.runCmd("register read pc")
+ self.runCmd("thread step-over")
+
+ # Verify that 'frame variable this' gets the data type correct.
+ self.expect("frame variable this",VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['C *'])
+
+ # Verify that frame variable --show-types this->m_c_int behaves correctly.
+ self.runCmd("register read pc")
+ self.runCmd("expr m_c_int")
+ self.expect("frame variable --show-types this->m_c_int", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = '(int) this->m_c_int = 66')
+
+ # Verify that 'expression this' gets the data type correct.
+ self.expect("expression this", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ['C *'])
+
+ # rdar://problem/8430916
+ # expr this->m_c_int returns an incorrect value
+ #
+ # Verify that expr this->m_c_int behaves correctly.
+ self.expect("expression this->m_c_int", VARIABLES_DISPLAYED_CORRECTLY,
+ patterns = ['\(int\) \$[0-9]+ = 66'])
+
+ def test_with_constructor_name (self):
+ """Test 'frame variable this' and 'expr this' when stopped inside a constructor."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ filespec = target.GetExecutable()
+ self.assertTrue(filespec, VALID_FILESPEC)
+
+ fsDir = os.path.normpath(filespec.GetDirectory())
+ fsFile = filespec.GetFilename()
+
+ self.assertTrue(fsDir == os.getcwd() and fsFile == "a.out",
+ "FileSpec matches the executable")
+
+ bpfilespec = lldb.SBFileSpec("main.cpp", False)
+
+ breakpoint = target.BreakpointCreateByLocation(bpfilespec, self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ # Verify the breakpoint just created.
+ self.expect(str(breakpoint), BREAKPOINT_CREATED, exe=False,
+ substrs = ['main.cpp',
+ str(self.line)])
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ if not process:
+ self.fail("SBTarget.Launch() failed")
+
+ if process.GetState() != lldb.eStateStopped:
+ self.fail("Process should be in the 'stopped' state, "
+ "instead the actual state is: '%s'" %
+ lldbutil.state_type_to_str(process.GetState()))
+
+ # The stop reason of the thread should be breakpoint.
+ thread = process.GetThreadAtIndex(0)
+ if thread.GetStopReason() != lldb.eStopReasonBreakpoint:
+ from lldbsuite.test.lldbutil import stop_reason_to_str
+ self.fail(STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS %
+ stop_reason_to_str(thread.GetStopReason()))
+
+ frame = thread.frames[0]
+ self.assertTrue (frame.IsValid(), "Got a valid frame.")
+
+ self.assertTrue ("C::C" in frame.name, "Constructor name includes class name.")
diff --git a/packages/Python/lldbsuite/test/lang/cpp/class_types/TestClassTypesDisassembly.py b/packages/Python/lldbsuite/test/lang/cpp/class_types/TestClassTypesDisassembly.py
new file mode 100644
index 000000000000..595d075d5180
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/class_types/TestClassTypesDisassembly.py
@@ -0,0 +1,94 @@
+"""
+Test the lldb disassemble command on each call frame when stopped on C's ctor.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class IterateFrameAndDisassembleTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_and_run_command(self):
+ """Disassemble each call frame when stopped on C's constructor."""
+ self.build()
+ self.breakOnCtor()
+
+ raw_output = self.res.GetOutput()
+ frameRE = re.compile(r"""
+ ^\s\sframe # heading for the frame info,
+ .* # wildcard, and
+ 0x[0-9a-f]{16} # the frame pc, and
+ \sa.out`(.+) # module`function, and
+ \s\+\s # the rest ' + ....'
+ """, re.VERBOSE)
+ for line in raw_output.split(os.linesep):
+ match = frameRE.search(line)
+ if match:
+ function = match.group(1)
+ #print("line:", line)
+ #print("function:", function)
+ self.runCmd("disassemble -n '%s'" % function)
+
+ @add_test_categories(['pyapi'])
+ def test_and_python_api(self):
+ """Disassemble each call frame when stopped on C's constructor."""
+ self.build()
+ self.breakOnCtor()
+
+ # Now use the Python API to get at each function on the call stack and
+ # disassemble it.
+ target = self.dbg.GetSelectedTarget()
+ process = target.GetProcess()
+ thread = process.GetThreadAtIndex(0)
+ depth = thread.GetNumFrames()
+ for i in range(depth - 1):
+ frame = thread.GetFrameAtIndex(i)
+ function = frame.GetFunction()
+ # Print the function header.
+ if self.TraceOn():
+ print()
+ print(function)
+ if function:
+ # Get all instructions for this function and print them out.
+ insts = function.GetInstructions(target)
+ for inst in insts:
+ # We could simply do 'print inst' to print out the disassembly.
+ # But we want to print to stdout only if self.TraceOn() is True.
+ disasm = str(inst)
+ if self.TraceOn():
+ print(disasm)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break for main.cpp.
+ self.line = line_number('main.cpp', '// Set break point at this line.')
+
+ def breakOnCtor(self):
+ """Setup/run the program so it stops on C's constructor."""
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break on the ctor function of class C.
+ bpno = lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint %d.'%(bpno)])
+
+ # This test was failing because we fail to put the C:: in front of constructore.
+ # We should maybe make another testcase to cover that specifically, but we shouldn't
+ # fail this whole testcase for an inessential issue.
+ # We should be stopped on the ctor function of class C.
+ # self.expect("thread backtrace", BACKTRACE_DISPLAYED_CORRECTLY,
+ # substrs = ['C::C'])
diff --git a/packages/Python/lldbsuite/test/lang/cpp/class_types/cmds.txt b/packages/Python/lldbsuite/test/lang/cpp/class_types/cmds.txt
new file mode 100644
index 000000000000..1c7ef9f1c8ad
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/class_types/cmds.txt
@@ -0,0 +1,3 @@
+b main.cpp:97
+c
+var
diff --git a/packages/Python/lldbsuite/test/lang/cpp/class_types/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/class_types/main.cpp
new file mode 100644
index 000000000000..251e66c3c9f7
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/class_types/main.cpp
@@ -0,0 +1,126 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+class Conversion
+{
+public:
+ Conversion (int i) :
+ m_i (i)
+ {}
+
+ operator bool()
+ {
+ return m_i != 0;
+ }
+
+private:
+ int m_i;
+};
+
+class A
+{
+public:
+ A(int i=0):
+ m_a_int(i),
+ m_aa_int(i+1)
+ {
+ }
+
+ //virtual
+ ~A()
+ {
+ }
+
+ int
+ GetInteger() const
+ {
+ return m_a_int;
+ }
+ void
+ SetInteger(int i)
+ {
+ m_a_int = i;
+ }
+
+protected:
+ int m_a_int;
+ int m_aa_int;
+};
+
+class B : public A
+{
+public:
+ B(int ai, int bi) :
+ A(ai),
+ m_b_int(bi)
+ {
+ }
+
+ //virtual
+ ~B()
+ {
+ }
+
+ int
+ GetIntegerB() const
+ {
+ return m_b_int;
+ }
+ void
+ SetIntegerB(int i)
+ {
+ m_b_int = i;
+ }
+
+protected:
+ int m_b_int;
+};
+
+#include <cstdio>
+class C : public B
+{
+public:
+ C(int ai, int bi, int ci) :
+ B(ai, bi),
+ m_c_int(ci)
+ {
+ printf("Within C::ctor() m_c_int=%d\n", m_c_int); // Set break point at this line.
+ }
+
+ //virtual
+ ~C()
+ {
+ }
+
+ int
+ GetIntegerC() const
+ {
+ return m_c_int;
+ }
+ void
+ SetIntegerC(int i)
+ {
+ m_c_int = i;
+ }
+
+protected:
+ int m_c_int;
+};
+
+int
+main (int argc, char const *argv[])
+{
+ A a(12);
+ B b(22,33);
+ C c(44,55,66);
+ Conversion conv(1);
+ if (conv)
+ return b.GetIntegerB() - a.GetInteger() + c.GetInteger();
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/diamond/Makefile b/packages/Python/lldbsuite/test/lang/cpp/diamond/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/diamond/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/diamond/TestDiamond.py b/packages/Python/lldbsuite/test/lang/cpp/diamond/TestDiamond.py
new file mode 100644
index 000000000000..67de03b54b20
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/diamond/TestDiamond.py
@@ -0,0 +1,41 @@
+"""
+Tests that bool types work
+"""
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class CPPTestDiamondInheritance(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_with_run_command(self):
+ """Test that virtual base classes work in when SBValue objects are used to explore the variable value"""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+ self.set_breakpoint(line_number('main.cpp', '// breakpoint 1'))
+ self.set_breakpoint(line_number('main.cpp', '// breakpoint 2'))
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+ thread = process.GetThreadAtIndex(0)
+ frame = thread.GetFrameAtIndex(0)
+ j1 = frame.FindVariable("j1")
+ j1_Derived1 = j1.GetChildAtIndex(0)
+ j1_Derived2 = j1.GetChildAtIndex(1)
+ j1_Derived1_VBase = j1_Derived1.GetChildAtIndex(0)
+ j1_Derived2_VBase = j1_Derived2.GetChildAtIndex(0)
+ j1_Derived1_VBase_m_value = j1_Derived1_VBase.GetChildAtIndex(0)
+ j1_Derived2_VBase_m_value = j1_Derived2_VBase.GetChildAtIndex(0)
+ self.assertTrue(j1_Derived1_VBase.GetLoadAddress() == j1_Derived2_VBase.GetLoadAddress(), "ensure virtual base class is the same between Derived1 and Derived2")
+ self.assertTrue(j1_Derived1_VBase_m_value.GetValueAsUnsigned(1) == j1_Derived2_VBase_m_value.GetValueAsUnsigned(2), "ensure m_value in VBase is the same")
+ self.assertTrue(frame.FindVariable("d").GetChildAtIndex(0).GetChildAtIndex(0).GetValueAsUnsigned(0) == 12345, "ensure Derived2 from j1 is correct");
+ thread.StepOver()
+ self.assertTrue(frame.FindVariable("d").GetChildAtIndex(0).GetChildAtIndex(0).GetValueAsUnsigned(0) == 12346, "ensure Derived2 from j2 is correct");
+
+ def set_breakpoint(self, line):
+ # Some compilers (for example GCC 4.4.7 and 4.6.1) emit multiple locations for the statement with the ternary
+ # operator in the test program, while others emit only 1.
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", line, num_expected_locations=-1, loc_exact=False)
diff --git a/packages/Python/lldbsuite/test/lang/cpp/diamond/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/diamond/main.cpp
new file mode 100644
index 000000000000..bfe098a089f5
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/diamond/main.cpp
@@ -0,0 +1,85 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdio.h>
+
+static int g_next_value = 12345;
+
+class VBase
+{
+public:
+ VBase() : m_value(g_next_value++) {}
+ virtual ~VBase() {}
+ void Print()
+ {
+ printf("%p: %s\n%p: m_value = 0x%8.8x\n", this, __PRETTY_FUNCTION__, &m_value, m_value);
+ }
+ int m_value;
+};
+
+class Derived1 : public virtual VBase
+{
+public:
+ Derived1() {};
+ void Print ()
+ {
+ printf("%p: %s\n", this, __PRETTY_FUNCTION__);
+ VBase::Print();
+ }
+
+};
+
+class Derived2 : public virtual VBase
+{
+public:
+ Derived2() {};
+
+ void Print ()
+ {
+ printf("%p: %s\n", this, __PRETTY_FUNCTION__);
+ VBase::Print();
+ }
+};
+
+class Joiner1 : public Derived1, public Derived2
+{
+public:
+ Joiner1() :
+ m_joiner1(3456),
+ m_joiner2(6789) {}
+ void Print ()
+ {
+ printf("%p: %s \n%p: m_joiner1 = 0x%8.8x\n%p: m_joiner2 = 0x%8.8x\n",
+ this,
+ __PRETTY_FUNCTION__,
+ &m_joiner1,
+ m_joiner1,
+ &m_joiner2,
+ m_joiner2);
+ Derived1::Print();
+ Derived2::Print();
+ }
+ int m_joiner1;
+ int m_joiner2;
+};
+
+class Joiner2 : public Derived2
+{
+ int m_stuff[32];
+};
+
+int main(int argc, const char * argv[])
+{
+ Joiner1 j1;
+ Joiner2 j2;
+ j1.Print();
+ j2.Print();
+ Derived2 *d = &j1;
+ d = &j2; // breakpoint 1
+ return 0; // breakpoint 2
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/Makefile b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/Makefile
new file mode 100644
index 000000000000..8770b2343ef0
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := pass-to-base.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/TestCppValueCast.py b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/TestCppValueCast.py
new file mode 100644
index 000000000000..4e23cd899285
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/TestCppValueCast.py
@@ -0,0 +1,129 @@
+"""
+Test lldb Python API SBValue::Cast(SBType) for C++ types.
+"""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class CppValueCastTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @unittest2.expectedFailure("rdar://problem/10808472 SBValue::Cast test case is failing (virtual inheritance)")
+ @add_test_categories(['pyapi'])
+ def test_value_cast_with_virtual_inheritance(self):
+ """Test SBValue::Cast(SBType) API for C++ types with virtual inheritance."""
+ self.build(dictionary=self.d_virtual)
+ self.setTearDownCleanup(dictionary=self.d_virtual)
+ self.do_sbvalue_cast(self.exe_name)
+
+ @add_test_categories(['pyapi'])
+ def test_value_cast_with_regular_inheritance(self):
+ """Test SBValue::Cast(SBType) API for C++ types with regular inheritance."""
+ self.build(dictionary=self.d_regular)
+ self.setTearDownCleanup(dictionary=self.d_regular)
+ self.do_sbvalue_cast(self.exe_name)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+
+ # Find the line number to break for main.c.
+ self.source = 'sbvalue-cast.cpp';
+ self.line = line_number(self.source, '// Set breakpoint here.')
+ self.exe_name = self.testMethodName
+ self.d_virtual = {'CXX_SOURCES': self.source, 'EXE': self.exe_name, 'CFLAGS_EXTRAS': '-DDO_VIRTUAL_INHERITANCE'}
+ self.d_regular = {'CXX_SOURCES': self.source, 'EXE': self.exe_name}
+
+ def do_sbvalue_cast (self, exe_name):
+ """Test SBValue::Cast(SBType) API for C++ types."""
+ exe = os.path.join(os.getcwd(), exe_name)
+
+ # Create a target from the debugger.
+
+ target = self.dbg.CreateTarget (exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Set up our breakpoints:
+
+ breakpoint = target.BreakpointCreateByLocation(self.source, self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at the entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process.GetState() == lldb.eStateStopped,
+ PROCESS_STOPPED)
+
+ # Find DerivedA and DerivedB types.
+ typeA = target.FindFirstType('DerivedA')
+ typeB = target.FindFirstType('DerivedB')
+ self.DebugSBType(typeA)
+ self.DebugSBType(typeB)
+ self.assertTrue(typeA)
+ self.assertTrue(typeB)
+ error = lldb.SBError()
+
+ # First stop is for DerivedA instance.
+ threads = lldbutil.get_threads_stopped_at_breakpoint (process, breakpoint)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+ frame0 = thread.GetFrameAtIndex(0)
+
+ tellerA = frame0.FindVariable('teller', lldb.eNoDynamicValues)
+ self.DebugSBValue(tellerA)
+ self.assertTrue(tellerA.GetChildMemberWithName('m_base_val').GetValueAsUnsigned(error, 0) == 20)
+
+ if self.TraceOn():
+ for child in tellerA:
+ print("child name:", child.GetName())
+ print(child)
+
+ # Call SBValue.Cast() to obtain instanceA.
+ instanceA = tellerA.Cast(typeA.GetPointerType())
+ self.DebugSBValue(instanceA)
+
+ # Iterate through all the children and print their values.
+ if self.TraceOn():
+ for child in instanceA:
+ print("child name:", child.GetName())
+ print(child)
+ a_member_val = instanceA.GetChildMemberWithName('m_a_val')
+ self.DebugSBValue(a_member_val)
+ self.assertTrue(a_member_val.GetValueAsUnsigned(error, 0) == 10)
+
+ # Second stop is for DerivedB instance.
+ threads = lldbutil.continue_to_breakpoint (process, breakpoint)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+ frame0 = thread.GetFrameAtIndex(0)
+
+ tellerB = frame0.FindVariable('teller', lldb.eNoDynamicValues)
+ self.DebugSBValue(tellerB)
+ self.assertTrue(tellerB.GetChildMemberWithName('m_base_val').GetValueAsUnsigned(error, 0) == 12)
+
+ if self.TraceOn():
+ for child in tellerB:
+ print("child name:", child.GetName())
+ print(child)
+
+ # Call SBValue.Cast() to obtain instanceB.
+ instanceB = tellerB.Cast(typeB.GetPointerType())
+ self.DebugSBValue(instanceB)
+
+ # Iterate through all the children and print their values.
+ if self.TraceOn():
+ for child in instanceB:
+ print("child name:", child.GetName())
+ print(child)
+ b_member_val = instanceB.GetChildMemberWithName('m_b_val')
+ self.DebugSBValue(b_member_val)
+ self.assertTrue(b_member_val.GetValueAsUnsigned(error, 0) == 36)
diff --git a/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/TestDynamicValue.py b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/TestDynamicValue.py
new file mode 100644
index 000000000000..56e81c56cfa6
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/TestDynamicValue.py
@@ -0,0 +1,223 @@
+"""
+Use lldb Python API to test dynamic values in C++
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class DynamicValueTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+
+ # Find the line number to break for main.c.
+
+ self.do_something_line = line_number('pass-to-base.cpp', '// Break here in doSomething.')
+ self.main_first_call_line = line_number('pass-to-base.cpp',
+ '// Break here and get real addresses of myB and otherB.')
+ self.main_second_call_line = line_number('pass-to-base.cpp',
+ '// Break here and get real address of reallyA.')
+
+ @expectedFailureFreeBSD # FIXME: This needs to be root-caused.
+ @expectedFailureWindows("llvm.org/pr24663")
+ @add_test_categories(['pyapi'])
+ def test_get_dynamic_vals(self):
+ """Test fetching C++ dynamic values from pointers & references."""
+ self.build(dictionary=self.getBuildFlags())
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target from the debugger.
+
+ target = self.dbg.CreateTarget (exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Set up our breakpoints:
+
+ do_something_bpt = target.BreakpointCreateByLocation('pass-to-base.cpp', self.do_something_line)
+ self.assertTrue(do_something_bpt,
+ VALID_BREAKPOINT)
+
+ first_call_bpt = target.BreakpointCreateByLocation('pass-to-base.cpp', self.main_first_call_line)
+ self.assertTrue(first_call_bpt,
+ VALID_BREAKPOINT)
+
+ second_call_bpt = target.BreakpointCreateByLocation('pass-to-base.cpp', self.main_second_call_line)
+ self.assertTrue(second_call_bpt,
+ VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at the entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process.GetState() == lldb.eStateStopped,
+ PROCESS_STOPPED)
+
+ threads = lldbutil.get_threads_stopped_at_breakpoint (process, first_call_bpt)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+
+ frame = thread.GetFrameAtIndex(0)
+
+ # Now find the dynamic addresses of myB and otherB so we can compare them
+ # with the dynamic values we get in doSomething:
+
+ use_dynamic = lldb.eDynamicCanRunTarget
+ no_dynamic = lldb.eNoDynamicValues
+
+ myB = frame.FindVariable ('myB', no_dynamic);
+ self.assertTrue (myB)
+ myB_loc = int (myB.GetLocation(), 16)
+
+ otherB = frame.FindVariable('otherB', no_dynamic)
+ self.assertTrue (otherB)
+ otherB_loc = int (otherB.GetLocation(), 16)
+
+ # Okay now run to doSomething:
+
+ threads = lldbutil.continue_to_breakpoint (process, do_something_bpt)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+
+ frame = thread.GetFrameAtIndex(0)
+
+ # Get "this" using FindVariable:
+
+ this_static = frame.FindVariable ('this', no_dynamic)
+ this_dynamic = frame.FindVariable ('this', use_dynamic)
+ self.examine_value_object_of_this_ptr (this_static, this_dynamic, myB_loc)
+
+ # Now make sure that the "GetDynamicValue" works:
+ # This doesn't work currently because we can't get dynamic values from ConstResult objects.
+ fetched_dynamic_value = this_static.GetDynamicValue(use_dynamic)
+ self.examine_value_object_of_this_ptr (this_static, fetched_dynamic_value, myB_loc)
+
+ # And conversely that the GetDynamicValue() interface also works:
+ fetched_static_value = this_dynamic.GetStaticValue()
+ self.examine_value_object_of_this_ptr (fetched_static_value, this_dynamic, myB_loc)
+
+ # Get "this" using FindValue, make sure that works too:
+ this_static = frame.FindValue ('this', lldb.eValueTypeVariableArgument, no_dynamic)
+ this_dynamic = frame.FindValue ('this', lldb.eValueTypeVariableArgument, use_dynamic)
+ self.examine_value_object_of_this_ptr (this_static, this_dynamic, myB_loc)
+
+ # Get "this" using the EvaluateExpression:
+ this_static = frame.EvaluateExpression ('this', False)
+ this_dynamic = frame.EvaluateExpression ('this', True)
+ self.examine_value_object_of_this_ptr (this_static, this_dynamic, myB_loc)
+
+ # The "frame var" code uses another path to get into children, so let's
+ # make sure that works as well:
+
+ self.expect('frame var -d run-target --ptr-depth=2 --show-types anotherA.m_client_A', 'frame var finds its way into a child member',
+ patterns = ['\(B \*\)'])
+
+ # Now make sure we also get it right for a reference as well:
+
+ anotherA_static = frame.FindVariable ('anotherA', False)
+ self.assertTrue (anotherA_static)
+ anotherA_static_addr = int (anotherA_static.GetValue(), 16)
+
+ anotherA_dynamic = frame.FindVariable ('anotherA', True)
+ self.assertTrue (anotherA_dynamic)
+ anotherA_dynamic_addr = int (anotherA_dynamic.GetValue(), 16)
+ anotherA_dynamic_typename = anotherA_dynamic.GetTypeName()
+ self.assertTrue (anotherA_dynamic_typename.find('B') != -1)
+
+ self.assertTrue(anotherA_dynamic_addr < anotherA_static_addr)
+
+ anotherA_m_b_value_dynamic = anotherA_dynamic.GetChildMemberWithName('m_b_value', True)
+ self.assertTrue (anotherA_m_b_value_dynamic)
+ anotherA_m_b_val = int (anotherA_m_b_value_dynamic.GetValue(), 10)
+ self.assertTrue (anotherA_m_b_val == 300)
+
+ anotherA_m_b_value_static = anotherA_static.GetChildMemberWithName('m_b_value', True)
+ self.assertFalse (anotherA_m_b_value_static)
+
+ # Okay, now continue again, and when we hit the second breakpoint in main
+
+ threads = lldbutil.continue_to_breakpoint (process, second_call_bpt)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+
+ frame = thread.GetFrameAtIndex(0)
+ reallyA_value = frame.FindVariable ('reallyA', False)
+ self.assertTrue(reallyA_value)
+ reallyA_loc = int (reallyA_value.GetLocation(), 16)
+
+ # Finally continue to doSomething again, and make sure we get the right value for anotherA,
+ # which this time around is just an "A".
+
+ threads = lldbutil.continue_to_breakpoint (process, do_something_bpt)
+ self.assertTrue(len(threads) == 1)
+ thread = threads[0]
+
+ frame = thread.GetFrameAtIndex(0)
+ anotherA_value = frame.FindVariable ('anotherA', True)
+ self.assertTrue(anotherA_value)
+ anotherA_loc = int (anotherA_value.GetValue(), 16)
+ self.assertTrue (anotherA_loc == reallyA_loc)
+ self.assertTrue (anotherA_value.GetTypeName().find ('B') == -1)
+
+ def examine_value_object_of_this_ptr (self, this_static, this_dynamic, dynamic_location):
+ # Get "this" as its static value
+ self.assertTrue (this_static)
+ this_static_loc = int (this_static.GetValue(), 16)
+
+ # Get "this" as its dynamic value
+
+ self.assertTrue (this_dynamic)
+ this_dynamic_typename = this_dynamic.GetTypeName()
+ self.assertTrue (this_dynamic_typename.find('B') != -1)
+ this_dynamic_loc = int (this_dynamic.GetValue(), 16)
+
+ # Make sure we got the right address for "this"
+
+ self.assertTrue (this_dynamic_loc == dynamic_location)
+
+ # And that the static address is greater than the dynamic one
+
+ self.assertTrue (this_static_loc > this_dynamic_loc)
+
+ # Now read m_b_value which is only in the dynamic value:
+
+ use_dynamic = lldb.eDynamicCanRunTarget
+ no_dynamic = lldb.eNoDynamicValues
+
+ this_dynamic_m_b_value = this_dynamic.GetChildMemberWithName('m_b_value', use_dynamic)
+ self.assertTrue (this_dynamic_m_b_value)
+
+ m_b_value = int (this_dynamic_m_b_value.GetValue(), 0)
+ self.assertTrue (m_b_value == 10)
+
+ # Make sure it is not in the static version
+
+ this_static_m_b_value = this_static.GetChildMemberWithName('m_b_value', no_dynamic)
+ self.assertFalse (this_static_m_b_value)
+
+ # Okay, now let's make sure that we can get the dynamic type of a child element:
+
+ contained_auto_ptr = this_dynamic.GetChildMemberWithName ('m_client_A', use_dynamic)
+ self.assertTrue (contained_auto_ptr)
+ contained_b = contained_auto_ptr.GetChildMemberWithName ('_M_ptr', use_dynamic)
+ if not contained_b:
+ contained_b = contained_auto_ptr.GetChildMemberWithName ('__ptr_', use_dynamic)
+ self.assertTrue (contained_b)
+
+ contained_b_static = contained_auto_ptr.GetChildMemberWithName ('_M_ptr', no_dynamic)
+ if not contained_b_static:
+ contained_b_static = contained_auto_ptr.GetChildMemberWithName ('__ptr_', no_dynamic)
+ self.assertTrue (contained_b_static)
+
+ contained_b_addr = int (contained_b.GetValue(), 16)
+ contained_b_static_addr = int (contained_b_static.GetValue(), 16)
+
+ self.assertTrue (contained_b_addr < contained_b_static_addr)
diff --git a/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/pass-to-base.cpp b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/pass-to-base.cpp
new file mode 100644
index 000000000000..2bccf3303823
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/pass-to-base.cpp
@@ -0,0 +1,69 @@
+#include <stdio.h>
+#include <memory>
+
+class Extra
+{
+public:
+ Extra (int in_one, int in_two) : m_extra_one(in_one), m_extra_two(in_two) {}
+
+private:
+ int m_extra_one;
+ int m_extra_two;
+};
+
+class A
+{
+public:
+ A(int value) : m_a_value (value) {}
+ A(int value, A* client_A) : m_a_value (value), m_client_A (client_A) {}
+
+ virtual ~A() {}
+
+ virtual void
+ doSomething (A &anotherA)
+ {
+ printf ("In A %p doing something with %d.\n", this, m_a_value);
+ int tmp_value = anotherA.Value();
+ printf ("Also have another A at %p: %d.\n", &anotherA, tmp_value); // Break here in doSomething.
+ }
+
+ int
+ Value()
+ {
+ return m_a_value;
+ }
+
+private:
+ int m_a_value;
+ std::auto_ptr<A> m_client_A;
+};
+
+class B : public Extra, public virtual A
+{
+public:
+ B (int b_value, int a_value) : Extra(b_value, a_value), A(a_value), m_b_value(b_value) {}
+ B (int b_value, int a_value, A *client_A) : Extra(b_value, a_value), A(a_value, client_A), m_b_value(b_value) {}
+
+ virtual ~B () {}
+
+private:
+ int m_b_value;
+};
+
+static A* my_global_A_ptr;
+
+int
+main (int argc, char **argv)
+{
+ my_global_A_ptr = new B (100, 200);
+ B myB (10, 20, my_global_A_ptr);
+ B *second_fake_A_ptr = new B (150, 250);
+ B otherB (300, 400, second_fake_A_ptr);
+
+ myB.doSomething(otherB); // Break here and get real addresses of myB and otherB.
+
+ A reallyA (500);
+ myB.doSomething (reallyA); // Break here and get real address of reallyA.
+
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/sbvalue-cast.cpp b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/sbvalue-cast.cpp
new file mode 100644
index 000000000000..00fd7dad438c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/dynamic-value/sbvalue-cast.cpp
@@ -0,0 +1,80 @@
+//===-- sbvalue-cast.cpp ----------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#ifdef DO_VIRTUAL_INHERITANCE
+#define VIRTUAL virtual
+#else
+#define VIRTUAL
+#endif
+
+#include <stdio.h>
+
+class Base
+{
+public:
+ Base(int val) : m_base_val (val) {}
+ virtual ~Base() {}
+
+ virtual void
+ forcast(int input) {
+ int future_val = m_base_val + input * 1;
+ printf("Forcasting %d\n", future_val);
+ }
+
+protected:
+ int m_base_val;
+};
+
+class DerivedA : public VIRTUAL Base
+{
+public:
+ DerivedA(int val) : Base(val*2), m_a_val(val) {
+ printf("DerivedA::ctor()->\n");
+ printf("m_base_val=%d\n", m_base_val);
+ printf("m_a_val=%d\n", m_a_val);
+ }
+ virtual ~DerivedA() {}
+
+private:
+ int m_a_val;
+};
+
+class DerivedB : public VIRTUAL Base
+{
+public:
+ DerivedB(int val) : Base(val), m_b_val(val*3) {
+ printf("DerivedB::ctor()->\n");
+ printf("m_base_val=%d\n", m_base_val);
+ printf("m_b_val=%d\n", m_b_val);
+ }
+ virtual ~DerivedB() {}
+
+ virtual void
+ forcast(int input) {
+ int future_val = m_b_val + input * 2;
+ printf("Forcasting %d\n", future_val);
+ }
+
+private:
+ int m_b_val;
+};
+
+int
+main(int argc, char **argv)
+{
+ DerivedA* dA = new DerivedA(10);
+ DerivedB* dB = new DerivedB(12);
+ Base *array[2] = {dA, dB};
+ Base *teller = NULL;
+ for (int i = 0; i < 2; ++i) {
+ teller = array[i];
+ teller->forcast(i); // Set breakpoint here.
+ }
+
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/enum_types/Makefile b/packages/Python/lldbsuite/test/lang/cpp/enum_types/Makefile
new file mode 100644
index 000000000000..0e0f5d1dad3d
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/enum_types/Makefile
@@ -0,0 +1,10 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+CXXFLAGS += -std=c++11
+
+clean: OBJECTS+=$(wildcard main.d.*)
+
+include $(LEVEL)/Makefile.rules
+
diff --git a/packages/Python/lldbsuite/test/lang/cpp/enum_types/TestCPP11EnumTypes.py b/packages/Python/lldbsuite/test/lang/cpp/enum_types/TestCPP11EnumTypes.py
new file mode 100644
index 000000000000..51c145c7b7cd
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/enum_types/TestCPP11EnumTypes.py
@@ -0,0 +1,110 @@
+"""Look up enum type information and check for correct display."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class CPP11EnumTypesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_int8_t(self):
+ """Test C++11 enumeration class types as int8_t types."""
+ self.build(dictionary={'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=int8_t"'})
+ self.image_lookup_for_enum_type()
+
+ def test_int16_t(self):
+ """Test C++11 enumeration class types as int16_t types."""
+ self.build(dictionary={'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=int16_t"'})
+ self.image_lookup_for_enum_type()
+
+ def test_int32_t(self):
+ """Test C++11 enumeration class types as int32_t types."""
+ self.build(dictionary={'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=int32_t"'})
+ self.image_lookup_for_enum_type()
+
+ def test_int64_t(self):
+ """Test C++11 enumeration class types as int64_t types."""
+ self.build(dictionary={'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=int64_t"'})
+ self.image_lookup_for_enum_type()
+
+ def test_uint8_t(self):
+ """Test C++11 enumeration class types as uint8_t types."""
+ self.build(dictionary={'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=uint8_t"'})
+ self.image_lookup_for_enum_type()
+
+ def test_uint16_t(self):
+ """Test C++11 enumeration class types as uint16_t types."""
+ self.build(dictionary={'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=uint16_t"'})
+ self.image_lookup_for_enum_type()
+
+ def test_uint32_t(self):
+ """Test C++11 enumeration class types as uint32_t types."""
+ self.build(dictionary={'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=uint32_t"'})
+ self.image_lookup_for_enum_type()
+
+ def test_uint64_t(self):
+ """Test C++11 enumeration class types as uint64_t types."""
+ self.build(dictionary={'CFLAGS_EXTRAS': '"-DTEST_BLOCK_CAPTURED_VARS=uint64_t"'})
+ self.image_lookup_for_enum_type()
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.cpp', '// Set break point at this line.')
+
+ def image_lookup_for_enum_type(self):
+ """Test C++11 enumeration class types."""
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the main.
+ bkpt_id = lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # Look up information about the 'DayType' enum type.
+ # Check for correct display.
+ self.expect("image lookup -t DayType", DATA_TYPES_DISPLAYED_CORRECTLY,
+ substrs = ['enum DayType {',
+ 'Monday',
+ 'Tuesday',
+ 'Wednesday',
+ 'Thursday',
+ 'Friday',
+ 'Saturday',
+ 'Sunday',
+ 'kNumDays',
+ '}'])
+
+ enum_values = [ '-4',
+ 'Monday',
+ 'Tuesday',
+ 'Wednesday',
+ 'Thursday',
+ 'Friday',
+ 'Saturday',
+ 'Sunday',
+ 'kNumDays',
+ '5'];
+
+ bkpt = self.target().FindBreakpointByID(bkpt_id)
+ for enum_value in enum_values:
+ self.expect("frame variable day", 'check for valid enumeration value',
+ substrs = [enum_value])
+ lldbutil.continue_to_breakpoint (self.process(), bkpt)
diff --git a/packages/Python/lldbsuite/test/lang/cpp/enum_types/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/enum_types/main.cpp
new file mode 100644
index 000000000000..8595050afbbf
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/enum_types/main.cpp
@@ -0,0 +1,33 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdio.h>
+#include <stdint.h>
+
+
+int main (int argc, char const *argv[])
+{
+ typedef int16_t enum_integer_t;
+ enum class DayType : enum_integer_t {
+ Monday = -3,
+ Tuesday,
+ Wednesday,
+ Thursday,
+ Friday,
+ Saturday,
+ Sunday,
+ kNumDays
+ };
+ enum_integer_t day_value;
+ for (day_value = (enum_integer_t)DayType::Monday - 1; day_value <= (enum_integer_t)DayType::kNumDays + 1; ++day_value)
+ {
+ DayType day = (DayType)day_value;
+ printf("day as int is %i\n", (int)day); // Set break point at this line.
+ }
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/exceptions/Makefile b/packages/Python/lldbsuite/test/lang/cpp/exceptions/Makefile
new file mode 100644
index 000000000000..a6bd8463ad54
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/exceptions/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := exceptions.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/exceptions/TestCPPExceptionBreakpoints.py b/packages/Python/lldbsuite/test/lang/cpp/exceptions/TestCPPExceptionBreakpoints.py
new file mode 100644
index 000000000000..65cf0b361d84
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/exceptions/TestCPPExceptionBreakpoints.py
@@ -0,0 +1,65 @@
+"""
+Test lldb exception breakpoint command for CPP.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class CPPBreakpointTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ self.source = 'exceptions.cpp'
+ self.catch_line = line_number(self.source, '// This is the line you should stop at for catch')
+
+ @expectedFailureWindows("llvm.org/pr24538") # clang-cl does not support throw or catch
+ def test(self):
+ """Test lldb exception breakpoint command for CPP."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target from the debugger.
+
+ target = self.dbg.CreateTarget (exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ exception_bkpt = target.BreakpointCreateForException (lldb.eLanguageTypeC_plus_plus, True, True)
+ self.assertTrue (exception_bkpt, "Made an exception breakpoint")
+
+ # Now run, and make sure we hit our breakpoint:
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue (process, "Got a valid process")
+
+ stopped_threads = []
+ stopped_threads = lldbutil.get_threads_stopped_at_breakpoint (process, exception_bkpt)
+ self.assertTrue (len(stopped_threads) == 1, "Stopped at our exception breakpoint.")
+ thread = stopped_threads[0]
+ # Make sure our throw function is still above us on the stack:
+
+ frame_functions = lldbutil.get_function_names(thread)
+ self.assertTrue (frame_functions.count ("throws_exception_on_even(int)") == 1, "Our throw function is still on the stack.")
+
+ # Okay we hit our exception throw breakpoint, now make sure we get our catch breakpoint.
+ # One potential complication is that we might hit a couple of the exception breakpoints in getting out of the throw.
+ # so loop till we don't see the throws function on the stack. We should stop one more time for our exception breakpoint
+ # and that should be the catch...
+
+ while frame_functions.count ("throws_exception_on_even(int)") == 1:
+ stopped_threads = lldbutil.continue_to_breakpoint (process, exception_bkpt)
+ self.assertTrue (len(stopped_threads) == 1)
+
+ thread = stopped_threads[0]
+ frame_functions = lldbutil.get_function_names(thread)
+
+ self.assertTrue (frame_functions.count ("throws_exception_on_even(int)") == 0, "At catch our throw function is off the stack")
+ self.assertTrue (frame_functions.count ("intervening_function(int)") == 0, "At catch our intervening function is off the stack")
+ self.assertTrue (frame_functions.count ("catches_exception(int)") == 1, "At catch our catch function is on the stack")
diff --git a/packages/Python/lldbsuite/test/lang/cpp/exceptions/exceptions.cpp b/packages/Python/lldbsuite/test/lang/cpp/exceptions/exceptions.cpp
new file mode 100644
index 000000000000..150d420b241b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/exceptions/exceptions.cpp
@@ -0,0 +1,42 @@
+#include <exception>
+#include <stdio.h>
+
+int throws_exception_on_even (int value);
+int intervening_function (int value);
+int catches_exception (int value);
+
+int
+catches_exception (int value)
+{
+ try
+ {
+ return intervening_function(value); // This is the line you should stop at for catch
+ }
+ catch (int value)
+ {
+ return value;
+ }
+}
+
+int
+intervening_function (int value)
+{
+ return throws_exception_on_even (2 * value);
+}
+
+int
+throws_exception_on_even (int value)
+{
+ printf ("Mod two works: %d.\n", value%2);
+ if (value % 2 == 0)
+ throw 30;
+ else
+ return value;
+}
+
+int
+main ()
+{
+ catches_exception (10); // Stop here
+ return 5;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/Makefile b/packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/TestFrameVariableAnonymousUnions.py b/packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/TestFrameVariableAnonymousUnions.py
new file mode 100644
index 000000000000..396a637041cb
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/TestFrameVariableAnonymousUnions.py
@@ -0,0 +1,27 @@
+"""
+Tests that frame variable looks into anonymous unions
+"""
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class FrameVariableAnonymousUnionsTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_with_run_command(self):
+ """Tests that frame variable looks into anonymous unions"""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ line = line_number('main.cpp', '// break here')
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", line, num_expected_locations=-1, loc_exact=False)
+
+ self.runCmd("process launch", RUN_SUCCEEDED)
+
+ self.expect('frame variable -f x i', substrs=['ffffff41'])
+ self.expect('frame variable c', substrs=["'A"])
+
+ self.expect('frame variable x', matching=False, substrs=['3'])
+ self.expect('frame variable y', matching=False, substrs=["'B'"])
+ self.expect('frame variable z', matching=False, substrs=['14'])
diff --git a/packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/main.cpp
new file mode 100644
index 000000000000..494b846336ff
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/frame-var-anon-unions/main.cpp
@@ -0,0 +1,23 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main() {
+ union {
+ int i;
+ char c;
+ };
+ struct {
+ int x;
+ char y;
+ short z;
+ } s{3,'B',14};
+ i = 0xFFFFFF00;
+ c = 'A';
+ return c; // break here
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/global_operators/Makefile b/packages/Python/lldbsuite/test/lang/cpp/global_operators/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/global_operators/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/global_operators/TestCppGlobalOperators.py b/packages/Python/lldbsuite/test/lang/cpp/global_operators/TestCppGlobalOperators.py
new file mode 100644
index 000000000000..de56cd6a6c49
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/global_operators/TestCppGlobalOperators.py
@@ -0,0 +1,54 @@
+"""
+Test that global operators are found and evaluated.
+"""
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TestCppGlobalOperators(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureWindows("llvm.org/pr21765")
+ def test_with_run_command(self):
+ self.build()
+
+ # Get main source file
+ src_file = "main.cpp"
+ src_file_spec = lldb.SBFileSpec(src_file)
+ self.assertTrue(src_file_spec.IsValid(), "Main source file")
+
+ # Get the path of the executable
+ cwd = os.getcwd()
+ exe_file = "a.out"
+ exe_path = os.path.join(cwd, exe_file)
+
+ # Load the executable
+ target = self.dbg.CreateTarget(exe_path)
+ self.assertTrue(target.IsValid(), VALID_TARGET)
+
+ # Break on main function
+ main_breakpoint = target.BreakpointCreateBySourceRegex("// break here", src_file_spec)
+ self.assertTrue(main_breakpoint.IsValid() and main_breakpoint.GetNumLocations() >= 1, VALID_BREAKPOINT)
+
+ # Launch the process
+ args = None
+ env = None
+ process = target.LaunchSimple(args, env, self.get_process_working_directory())
+ self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
+
+ # Get the thread of the process
+ self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
+ thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+
+ # Check if global operators are evaluated
+ frame = thread.GetSelectedFrame()
+
+ test_result = frame.EvaluateExpression("operator==(s1, s2)")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "false", "operator==(s1, s2) = false")
+
+ test_result = frame.EvaluateExpression("operator==(s1, s3)")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "true", "operator==(s1, s3) = true")
+
+ test_result = frame.EvaluateExpression("operator==(s2, s3)")
+ self.assertTrue(test_result.IsValid() and test_result.GetValue() == "false", "operator==(s2, s3) = false")
diff --git a/packages/Python/lldbsuite/test/lang/cpp/global_operators/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/global_operators/main.cpp
new file mode 100644
index 000000000000..a0dd0787fa32
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/global_operators/main.cpp
@@ -0,0 +1,16 @@
+struct Struct {
+ int value;
+};
+
+bool operator==(const Struct &a, const Struct &b) {
+ return a.value == b.value;
+}
+
+int main() {
+ Struct s1, s2, s3;
+ s1.value = 3;
+ s2.value = 5;
+ s3.value = 3;
+ return 0; // break here
+}
+
diff --git a/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/Makefile b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/Makefile
new file mode 100644
index 000000000000..6595e33b7269
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/Makefile
@@ -0,0 +1,35 @@
+LEVEL = ../../../make
+
+CXX_SOURCES = main.cpp length.cpp a.cpp
+
+CFLAGS_LIMIT = -c $(CXXFLAGS)
+CFLAGS_NO_LIMIT = -c $(CXXFLAGS)
+
+ifneq (,$(findstring clang,$(CC)))
+ CFLAGS_LIMIT += -flimit-debug-info
+ CFLAGS_NO_LIMIT += -fno-limit-debug-info
+endif
+
+all: limit nolimit
+
+limit: main.o length_limit.o a.o
+ $(CXX) $(LDFLAGS) main.o length_limit.o a.o -o limit
+
+nolimit: main.o length_nolimit.o a.o
+ $(CXX) $(LDFLAGS) main.o length_nolimit.o a.o -o nolimit
+
+main.o: main.cpp
+ $(CXX) $(CFLAGS_LIMIT) main.cpp -o main.o
+
+length_limit.o: length.cpp
+ $(CXX) $(CFLAGS_LIMIT) length.cpp -o length_limit.o
+
+length_nolimit.o: length.cpp
+ $(CXX) $(CFLAGS_NO_LIMIT) length.cpp -o length_nolimit.o
+
+a.o: a.cpp
+ $(CXX) $(CFLAGS_NO_DEBUG) -c a.cpp -o a.o
+
+clean: OBJECTS += limit nolimit length_limit.o length_nolimit.o length_limit.dwo length_nolimit.dwo
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py
new file mode 100644
index 000000000000..324f476efb9b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/TestCppIncompleteTypes.py
@@ -0,0 +1,66 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TestCppIncompleteTypes(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureFreeBSD("llvm.org/pr25626 test executable not built correctly on FreeBSD")
+ @skipIfGcc
+ def test_limit_debug_info(self):
+ self.build()
+ frame = self.get_test_frame('limit')
+
+ value_f = frame.EvaluateExpression("f")
+ self.assertTrue(value_f.IsValid(), "'expr f' results in a valid SBValue object")
+ self.assertTrue(value_f.GetError().Success(), "'expr f' is successful")
+
+ value_a = frame.EvaluateExpression("a")
+ self.assertTrue(value_a.IsValid(), "'expr a' results in a valid SBValue object")
+ self.assertTrue(value_a.GetError().Success(), "'expr a' is successful")
+
+ @skipIfGcc
+ @skipIfWindows # Clang on Windows asserts in external record layout in this case.
+ def test_partial_limit_debug_info(self):
+ self.build()
+ frame = self.get_test_frame('nolimit')
+
+ value_f = frame.EvaluateExpression("f")
+ self.assertTrue(value_f.IsValid(), "'expr f' results in a valid SBValue object")
+ self.assertTrue(value_f.GetError().Success(), "'expr f' is successful")
+
+ value_a = frame.EvaluateExpression("a")
+ self.assertTrue(value_a.IsValid(), "'expr a' results in a valid SBValue object")
+ self.assertTrue(value_a.GetError().Success(), "'expr a' is successful")
+
+ def get_test_frame(self, exe):
+ # Get main source file
+ src_file = "main.cpp"
+ src_file_spec = lldb.SBFileSpec(src_file)
+ self.assertTrue(src_file_spec.IsValid(), "Main source file")
+
+ # Get the path of the executable
+ cwd = os.getcwd()
+ exe_path = os.path.join(cwd, exe)
+
+ # Load the executable
+ target = self.dbg.CreateTarget(exe_path)
+ self.assertTrue(target.IsValid(), VALID_TARGET)
+
+ # Break on main function
+ main_breakpoint = target.BreakpointCreateBySourceRegex("break here", src_file_spec)
+ self.assertTrue(main_breakpoint.IsValid() and main_breakpoint.GetNumLocations() >= 1, VALID_BREAKPOINT)
+
+ # Launch the process
+ args = None
+ env = None
+ process = target.LaunchSimple(args, env, self.get_process_working_directory())
+ self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
+
+ # Get the thread of the process
+ self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
+ thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+
+ # Get frame for current thread
+ return thread.GetSelectedFrame()
diff --git a/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/a.cpp b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/a.cpp
new file mode 100644
index 000000000000..36b374be6f33
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/a.cpp
@@ -0,0 +1,10 @@
+
+#include "a.h"
+
+A::A () { }
+
+int
+A::length ()
+{
+ return 123;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/a.h b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/a.h
new file mode 100644
index 000000000000..13e9496e3fd7
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/a.h
@@ -0,0 +1,11 @@
+#ifndef __A_H__
+#define __A_H__
+
+class A
+{
+public:
+ A();
+ virtual int length();
+};
+
+#endif
diff --git a/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/length.cpp b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/length.cpp
new file mode 100644
index 000000000000..90a3b640f732
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/length.cpp
@@ -0,0 +1,8 @@
+
+#include "length.h"
+
+int
+length (A &a)
+{
+ return a.length();
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/length.h b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/length.h
new file mode 100644
index 000000000000..96df4f021808
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/length.h
@@ -0,0 +1,8 @@
+#ifndef __LENGTH_H__
+#define __LENGTH_H__
+
+#include "a.h"
+
+int length (A &a);
+
+#endif
diff --git a/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/main.cpp
new file mode 100644
index 000000000000..ad324c905818
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/incomplete-types/main.cpp
@@ -0,0 +1,18 @@
+
+#include "length.h"
+
+class Foo {
+public:
+ A a;
+};
+
+class MyA : public A {
+};
+
+int main()
+{
+ Foo f;
+ MyA a;
+
+ return length(a); // break here
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/Makefile b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/Makefile
new file mode 100644
index 000000000000..b9a3d3fe1c81
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/Makefile
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+CXX_SOURCES = main.cpp derived.cpp base.cpp
+
+CFLAGS_EXTRAS += $(LIMIT_DEBUG_INFO_FLAGS)
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/TestWithLimitDebugInfo.py b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/TestWithLimitDebugInfo.py
new file mode 100644
index 000000000000..ec26f9efe907
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/TestWithLimitDebugInfo.py
@@ -0,0 +1,48 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TestWithLimitDebugInfo(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipIf(debug_info=not_in(["dwarf"]))
+ def test_limit_debug_info(self):
+ self.build()
+
+ cwd = os.getcwd()
+
+ src_file = os.path.join(cwd, "main.cpp")
+ src_file_spec = lldb.SBFileSpec(src_file)
+ self.assertTrue(src_file_spec.IsValid(), "breakpoint file")
+
+ # Get the path of the executable
+ exe_path = os.path.join(cwd, 'a.out')
+
+ # Load the executable
+ target = self.dbg.CreateTarget(exe_path)
+ self.assertTrue(target.IsValid(), VALID_TARGET)
+
+ # Break on main function
+ breakpoint = target.BreakpointCreateBySourceRegex("break here", src_file_spec)
+ self.assertTrue(breakpoint.IsValid() and breakpoint.GetNumLocations() >= 1, VALID_BREAKPOINT)
+
+ # Launch the process
+ process = target.LaunchSimple(None, None, self.get_process_working_directory())
+ self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
+
+ # Get the thread of the process
+ self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
+ thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+ thread.StepInto()
+
+ # Get frame for current thread
+ frame = thread.GetSelectedFrame()
+
+ v1 = frame.EvaluateExpression("1")
+ self.assertTrue(v1.IsValid(), "'expr 1' results in a valid SBValue object")
+ self.assertTrue(v1.GetError().Success(), "'expr 1' succeeds without an error.")
+
+ v2 = frame.EvaluateExpression("this")
+ self.assertTrue(v2.IsValid(), "'expr this' results in a valid SBValue object")
+ self.assertTrue(v2.GetError().Success(), "'expr this' succeeds without an error.")
diff --git a/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/base.cpp b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/base.cpp
new file mode 100644
index 000000000000..4023bdbc64af
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/base.cpp
@@ -0,0 +1,6 @@
+#include "base.h"
+
+void FooNS::bar() {
+ x = 54321;
+}
+
diff --git a/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/base.h b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/base.h
new file mode 100644
index 000000000000..d3a09572bd25
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/base.h
@@ -0,0 +1,10 @@
+class FooNS
+{
+public:
+ virtual void bar();
+ virtual char baz() = 0;
+
+protected:
+ int x;
+};
+
diff --git a/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/derived.cpp b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/derived.cpp
new file mode 100644
index 000000000000..9d773593eb51
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/derived.cpp
@@ -0,0 +1,6 @@
+#include "derived.h"
+
+char Foo::baz() {
+ return (char)(x&0xff);
+}
+
diff --git a/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/derived.h b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/derived.h
new file mode 100644
index 000000000000..46b3f83b9f74
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/derived.h
@@ -0,0 +1,13 @@
+#include "base.h"
+
+class Foo : public FooNS
+{
+public:
+ Foo() {
+ a = 12345;
+ }
+
+ char baz() override;
+ int a;
+};
+
diff --git a/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/main.cpp
new file mode 100644
index 000000000000..64e0349b5826
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/limit-debug-info/main.cpp
@@ -0,0 +1,7 @@
+#include "derived.h"
+
+int main() {
+ Foo f; // break here
+ f.bar();
+ return f.baz();
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/namespace/Makefile b/packages/Python/lldbsuite/test/lang/cpp/namespace/Makefile
new file mode 100644
index 000000000000..7dd5eb4c11f1
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/namespace/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp ns.cpp ns2.cpp ns3.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespace.py b/packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespace.py
new file mode 100644
index 000000000000..a60d8252e9f0
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespace.py
@@ -0,0 +1,125 @@
+"""
+Test the printing of anonymous and named namespace variables.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class NamespaceTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers for declarations of namespace variables i and j.
+ self.line_var_i = line_number('main.cpp',
+ '// Find the line number for anonymous namespace variable i.')
+ self.line_var_j = line_number('main.cpp',
+ '// Find the line number for named namespace variable j.')
+ # And the line number to break at.
+ self.line_break = line_number('main.cpp',
+ '// Set break point at this line.')
+ # Break inside do {} while and evaluate value
+ self.line_break_ns1 = line_number('main.cpp', '// Evaluate ns1::value')
+ self.line_break_ns2 = line_number('main.cpp', '// Evaluate ns2::value')
+
+ def runToBkpt(self, command):
+ self.runCmd(command, RUN_SUCCEEDED)
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # rdar://problem/8668674
+ @expectedFailureWindows("llvm.org/pr24764")
+ def test_with_run_command(self):
+ """Test that anonymous and named namespace variables display correctly."""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line_break_ns1, num_expected_locations=1, loc_exact=True)
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line_break_ns2, num_expected_locations=1, loc_exact=True)
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line_break, num_expected_locations=1, loc_exact=True)
+
+ self.runToBkpt("run")
+ # Evaluate ns1::value
+ self.expect("expression -- value", startstr = "(int) $0 = 100")
+
+ self.runToBkpt("continue")
+ # Evaluate ns2::value
+ self.expect("expression -- value", startstr = "(int) $1 = 200")
+
+ self.runToBkpt("continue")
+ # On Mac OS X, gcc 4.2 emits the wrong debug info with respect to types.
+ slist = ['(int) a = 12', 'anon_uint', 'a_uint', 'b_uint', 'y_uint']
+ if self.platformIsDarwin() and self.getCompiler() in ['clang', 'llvm-gcc']:
+ slist = ['(int) a = 12',
+ '::my_uint_t', 'anon_uint = 0',
+ '(A::uint_t) a_uint = 1',
+ '(A::B::uint_t) b_uint = 2',
+ '(Y::uint_t) y_uint = 3']
+
+ # 'frame variable' displays the local variables with type information.
+ self.expect('frame variable', VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = slist)
+
+ # 'frame variable' with basename 'i' should work.
+ self.expect("frame variable --show-declaration --show-globals i",
+ startstr = "main.cpp:%d: (int) (anonymous namespace)::i = 3" % self.line_var_i)
+ # main.cpp:12: (int) (anonymous namespace)::i = 3
+
+ # 'frame variable' with basename 'j' should work, too.
+ self.expect("frame variable --show-declaration --show-globals j",
+ startstr = "main.cpp:%d: (int) A::B::j = 4" % self.line_var_j)
+ # main.cpp:19: (int) A::B::j = 4
+
+ # 'frame variable' should support address-of operator.
+ self.runCmd("frame variable &i")
+
+ # 'frame variable' with fully qualified name 'A::B::j' should work.
+ self.expect("frame variable A::B::j", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = '(int) A::B::j = 4',
+ patterns = [' = 4'])
+
+ # So should the anonymous namespace case.
+ self.expect("frame variable '(anonymous namespace)::i'", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = '(int) (anonymous namespace)::i = 3',
+ patterns = [' = 3'])
+
+ # rdar://problem/8660275
+ # test/namespace: 'expression -- i+j' not working
+ # This has been fixed.
+ self.expect("expression -- i + j",
+ startstr = "(int) $2 = 7")
+ # (int) $2 = 7
+
+ self.runCmd("expression -- i")
+ self.runCmd("expression -- j")
+
+ # rdar://problem/8668674
+ # expression command with fully qualified namespace for a variable does not work
+ self.expect("expression -- ::i", VARIABLES_DISPLAYED_CORRECTLY,
+ patterns = [' = 3'])
+ self.expect("expression -- A::B::j", VARIABLES_DISPLAYED_CORRECTLY,
+ patterns = [' = 4'])
+
+ # expression command with function in anonymous namespace
+ self.expect("expression -- myanonfunc(3)",
+ patterns = [' = 6'])
+
+ # global namespace qualification with function in anonymous namespace
+ self.expect("expression -- ::myanonfunc(4)",
+ patterns = [' = 8'])
+
+ self.expect("p myanonfunc",
+ patterns = ['\(anonymous namespace\)::myanonfunc\(int\)'])
+
+ self.expect("p variadic_sum",
+ patterns = ['\(anonymous namespace\)::variadic_sum\(int, ...\)'])
diff --git a/packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespaceLookup.py b/packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespaceLookup.py
new file mode 100644
index 000000000000..4cad45564c87
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/namespace/TestNamespaceLookup.py
@@ -0,0 +1,223 @@
+"""
+Test the printing of anonymous and named namespace variables.
+"""
+
+from __future__ import print_function
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class NamespaceLookupTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Break inside different scopes and evaluate value
+ self.line_break_global_scope = line_number('ns.cpp', '// BP_global_scope')
+ self.line_break_file_scope = line_number('ns2.cpp', '// BP_file_scope')
+ self.line_break_ns_scope = line_number('ns2.cpp', '// BP_ns_scope')
+ self.line_break_nested_ns_scope = line_number('ns2.cpp', '// BP_nested_ns_scope')
+ self.line_break_nested_ns_scope_after_using = line_number('ns2.cpp', '// BP_nested_ns_scope_after_using')
+ self.line_break_before_using_directive = line_number('ns3.cpp', '// BP_before_using_directive')
+ self.line_break_after_using_directive = line_number('ns3.cpp', '// BP_after_using_directive')
+
+ def runToBkpt(self, command):
+ self.runCmd(command, RUN_SUCCEEDED)
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ @expectedFailureFreeBSD("llvm.org/pr25819")
+ @expectedFailureLinux("llvm.org/pr25819")
+ def test_scope_lookup_with_run_command(self):
+ """Test scope lookup of functions in lldb."""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "ns.cpp", self.line_break_global_scope, num_expected_locations=1, loc_exact=False)
+ lldbutil.run_break_set_by_file_and_line (self, "ns2.cpp", self.line_break_ns_scope, num_expected_locations=1, loc_exact=False)
+ lldbutil.run_break_set_by_file_and_line (self, "ns2.cpp", self.line_break_nested_ns_scope, num_expected_locations=1, loc_exact=False)
+ lldbutil.run_break_set_by_file_and_line (self, "ns2.cpp", self.line_break_nested_ns_scope_after_using, num_expected_locations=1, loc_exact=False)
+ lldbutil.run_break_set_by_file_and_line (self, "ns3.cpp", self.line_break_before_using_directive, num_expected_locations=1, loc_exact=False)
+ lldbutil.run_break_set_by_file_and_line (self, "ns3.cpp", self.line_break_after_using_directive, num_expected_locations=1, loc_exact=False)
+
+ # Run to BP_global_scope at global scope
+ self.runToBkpt("run")
+ # Evaluate func() - should call ::func()
+ self.expect("expr -- func()", startstr = "(int) $0 = 1")
+ # Evaluate A::B::func() - should call A::B::func()
+ self.expect("expr -- A::B::func()", startstr = "(int) $1 = 4")
+ # Evaluate func(10) - should call ::func(int)
+ self.expect("expr -- func(10)", startstr = "(int) $2 = 11")
+ # Evaluate ::func() - should call A::func()
+ self.expect("expr -- ::func()", startstr = "(int) $3 = 1")
+ # Evaluate A::foo() - should call A::foo()
+ self.expect("expr -- A::foo()", startstr = "(int) $4 = 42")
+
+ # Continue to BP_ns_scope at ns scope
+ self.runToBkpt("continue")
+ # Evaluate func(10) - should call A::func(int)
+ self.expect("expr -- func(10)", startstr = "(int) $5 = 13")
+ # Evaluate B::func() - should call B::func()
+ self.expect("expr -- B::func()", startstr = "(int) $6 = 4")
+ # Evaluate func() - should call A::func()
+ self.expect("expr -- func()", startstr = "(int) $7 = 3")
+
+ # Continue to BP_nested_ns_scope at nested ns scope
+ self.runToBkpt("continue")
+ # Evaluate func() - should call A::B::func()
+ self.expect("expr -- func()", startstr = "(int) $8 = 4")
+ # Evaluate A::func() - should call A::func()
+ self.expect("expr -- A::func()", startstr = "(int) $9 = 3")
+
+ # Evaluate func(10) - should call A::func(10)
+ # NOTE: Under the rules of C++, this test would normally get an error
+ # because A::B::func() hides A::func(), but lldb intentionally
+ # disobeys these rules so that the intended overload can be found
+ # by only removing duplicates if they have the same type.
+ self.expect("expr -- func(10)", startstr = "(int) $10 = 13")
+
+ # Continue to BP_nested_ns_scope_after_using at nested ns scope after using declaration
+ self.runToBkpt("continue")
+ # Evaluate A::func(10) - should call A::func(int)
+ self.expect("expr -- A::func(10)", startstr = "(int) $11 = 13")
+
+ # Continue to BP_before_using_directive at global scope before using declaration
+ self.runToBkpt("continue")
+ # Evaluate ::func() - should call ::func()
+ self.expect("expr -- ::func()", startstr = "(int) $12 = 1")
+ # Evaluate B::func() - should call B::func()
+ self.expect("expr -- B::func()", startstr = "(int) $13 = 4")
+
+ # Continue to BP_after_using_directive at global scope after using declaration
+ self.runToBkpt("continue")
+ # Evaluate ::func() - should call ::func()
+ self.expect("expr -- ::func()", startstr = "(int) $14 = 1")
+ # Evaluate B::func() - should call B::func()
+ self.expect("expr -- B::func()", startstr = "(int) $15 = 4")
+
+ @unittest2.expectedFailure("lldb scope lookup of functions bugs")
+ def test_function_scope_lookup_with_run_command(self):
+ """Test scope lookup of functions in lldb."""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "ns.cpp", self.line_break_global_scope, num_expected_locations=1, loc_exact=False)
+ lldbutil.run_break_set_by_file_and_line (self, "ns2.cpp", self.line_break_ns_scope, num_expected_locations=1, loc_exact=False)
+
+ # Run to BP_global_scope at global scope
+ self.runToBkpt("run")
+ # Evaluate foo() - should call ::foo()
+ # FIXME: lldb finds Y::foo because lookup for variables is done
+ # before functions.
+ self.expect("expr -- foo()", startstr = "(int) $0 = 42")
+ # Evaluate ::foo() - should call ::foo()
+ # FIXME: lldb finds Y::foo because lookup for variables is done
+ # before functions and :: is ignored.
+ self.expect("expr -- ::foo()", startstr = "(int) $1 = 42")
+
+ # Continue to BP_ns_scope at ns scope
+ self.runToBkpt("continue")
+ # Evaluate foo() - should call A::foo()
+ # FIXME: lldb finds Y::foo because lookup for variables is done
+ # before functions.
+ self.expect("expr -- foo()", startstr = "(int) $2 = 42")
+
+ @unittest2.expectedFailure("lldb file scope lookup bugs")
+ def test_file_scope_lookup_with_run_command(self):
+ """Test file scope lookup in lldb."""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "ns2.cpp", self.line_break_file_scope, num_expected_locations=1, loc_exact=False)
+
+ # Run to BP_file_scope at file scope
+ self.runToBkpt("run")
+ # Evaluate func() - should call static ns2.cpp:func()
+ # FIXME: This test fails because lldb doesn't know about file scopes so
+ # finds the global ::func().
+ self.expect("expr -- func()", startstr = "(int) $0 = 2")
+
+ @expectedFailureLinux("llvm.org/pr25819")
+ def test_scope_lookup_before_using_with_run_command(self):
+ """Test scope lookup before using in lldb."""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "ns3.cpp", self.line_break_before_using_directive, num_expected_locations=1, loc_exact=False)
+
+ # Run to BP_before_using_directive at global scope before using declaration
+ self.runToBkpt("run")
+ # Evaluate func() - should call ::func()
+ self.expect("expr -- func()", startstr = "(int) $0 = 1")
+
+ # NOTE: this test may fail on older systems that don't emit import
+ # emtries in DWARF - may need to add checks for compiler versions here.
+ @expectedFailureFreeBSD("llvm.org/pr25819")
+ @expectedFailureLinux("llvm.org/pr25819")
+ def test_scope_after_using_directive_lookup_with_run_command(self):
+ """Test scope lookup after using directive in lldb."""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "ns3.cpp", self.line_break_after_using_directive, num_expected_locations=1, loc_exact=False)
+
+ # Run to BP_after_using_directive at global scope after using declaration
+ self.runToBkpt("run")
+ # Evaluate func2() - should call A::func2()
+ self.expect("expr -- func2()", startstr = "(int) $0 = 3")
+
+ @unittest2.expectedFailure("lldb scope lookup after using declaration bugs")
+ # NOTE: this test may fail on older systems that don't emit import
+ # emtries in DWARF - may need to add checks for compiler versions here.
+ def test_scope_after_using_declaration_lookup_with_run_command(self):
+ """Test scope lookup after using declaration in lldb."""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "ns2.cpp", self.line_break_nested_ns_scope_after_using, num_expected_locations=1, loc_exact=False)
+
+ # Run to BP_nested_ns_scope_after_using at nested ns scope after using declaration
+ self.runToBkpt("run")
+ # Evaluate func() - should call A::func()
+ self.expect("expr -- func()", startstr = "(int) $0 = 3")
+
+ @unittest2.expectedFailure("lldb scope lookup ambiguity after using bugs")
+ def test_scope_ambiguity_after_using_lookup_with_run_command(self):
+ """Test scope lookup ambiguity after using in lldb."""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "ns3.cpp", self.line_break_after_using_directive, num_expected_locations=1, loc_exact=False)
+
+ # Run to BP_after_using_directive at global scope after using declaration
+ self.runToBkpt("run")
+ # Evaluate func() - should get error: ambiguous
+ # FIXME: This test fails because lldb removes duplicates if they have
+ # the same type.
+ self.expect("expr -- func()", startstr = "error")
+
+ @expectedFailureFreeBSD("llvm.org/pr25819")
+ @expectedFailureLinux("llvm.org/pr25819")
+ def test_scope_lookup_shadowed_by_using_with_run_command(self):
+ """Test scope lookup shadowed by using in lldb."""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "ns2.cpp", self.line_break_nested_ns_scope, num_expected_locations=1, loc_exact=False)
+
+ # Run to BP_nested_ns_scope at nested ns scope
+ self.runToBkpt("run")
+ # Evaluate func(10) - should call A::func(10)
+ # NOTE: Under the rules of C++, this test would normally get an error
+ # because A::B::func() shadows A::func(), but lldb intentionally
+ # disobeys these rules so that the intended overload can be found
+ # by only removing duplicates if they have the same type.
+ self.expect("expr -- func(10)", startstr = "(int) $0 = 13")
+
diff --git a/packages/Python/lldbsuite/test/lang/cpp/namespace/cmds.txt b/packages/Python/lldbsuite/test/lang/cpp/namespace/cmds.txt
new file mode 100644
index 000000000000..76bb1bcba759
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/namespace/cmds.txt
@@ -0,0 +1,3 @@
+b main.cpp:54
+c
+var
diff --git a/packages/Python/lldbsuite/test/lang/cpp/namespace/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/namespace/main.cpp
new file mode 100644
index 000000000000..560ec40f4733
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/namespace/main.cpp
@@ -0,0 +1,124 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <cstdarg>
+#include "ns.h"
+
+namespace {
+ typedef unsigned int my_uint_t;
+ int i; // Find the line number for anonymous namespace variable i.
+
+ int myanonfunc (int a)
+ {
+ return a + a;
+ }
+
+ int
+ variadic_sum (int arg_count...)
+ {
+ int sum = 0;
+ va_list args;
+ va_start(args, arg_count);
+
+ for (int i = 0; i < arg_count; i++)
+ sum += va_arg(args, int);
+
+ va_end(args);
+ return sum;
+ }
+}
+
+namespace A {
+ typedef unsigned int uint_t;
+ namespace B {
+ typedef unsigned int uint_t;
+ int j; // Find the line number for named namespace variable j.
+ int myfunc (int a);
+ int myfunc2(int a)
+ {
+ return a + 2;
+ }
+ float myfunc (float f)
+ {
+ return f - 2.0;
+ }
+ }
+}
+
+namespace Y
+{
+ typedef unsigned int uint_t;
+ using A::B::j;
+ int foo;
+}
+
+using A::B::j; // using declaration
+
+namespace Foo = A::B; // namespace alias
+
+using Foo::myfunc; // using declaration
+
+using namespace Foo; // using directive
+
+namespace A {
+ namespace B {
+ using namespace Y;
+ int k;
+ }
+}
+
+namespace ns1 {
+ int value = 100;
+}
+
+namespace ns2 {
+ int value = 200;
+}
+
+void test_namespace_scopes() {
+ do {
+ using namespace ns1;
+ printf("ns1::value = %d\n", value); // Evaluate ns1::value
+ } while(0);
+
+ do {
+ using namespace ns2;
+ printf("ns2::value = %d\n", value); // Evaluate ns2::value
+ } while(0);
+}
+
+int Foo::myfunc(int a)
+{
+ test_namespace_scopes();
+
+ ::my_uint_t anon_uint = 0;
+ A::uint_t a_uint = 1;
+ B::uint_t b_uint = 2;
+ Y::uint_t y_uint = 3;
+ i = 3;
+ j = 4;
+ printf("::i=%d\n", ::i);
+ printf("A::B::j=%d\n", A::B::j);
+ printf("variadic_sum=%d\n", variadic_sum(3, 1, 2, 3));
+ myanonfunc(3);
+ return myfunc2(3) + j + i + a + 2 + anon_uint + a_uint + b_uint + y_uint; // Set break point at this line.
+}
+
+int
+main (int argc, char const *argv[])
+{
+ test_lookup_at_global_scope();
+ test_lookup_at_file_scope();
+ A::test_lookup_at_ns_scope();
+ A::B::test_lookup_at_nested_ns_scope();
+ A::B::test_lookup_at_nested_ns_scope_after_using();
+ test_lookup_before_using_directive();
+ test_lookup_after_using_directive();
+ return Foo::myfunc(12);
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/namespace/ns.cpp b/packages/Python/lldbsuite/test/lang/cpp/namespace/ns.cpp
new file mode 100644
index 000000000000..9e5637d02b4b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/namespace/ns.cpp
@@ -0,0 +1,32 @@
+//===-- ns.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "ns.h"
+
+int foo()
+{
+ printf("global foo()\n");
+ return 42;
+}
+int func()
+{
+ printf("global func()\n");
+ return 1;
+}
+int func(int a)
+{
+ printf("global func(int)\n");
+ return a + 1;
+}
+void test_lookup_at_global_scope()
+{
+ // BP_global_scope
+ printf("at global scope: foo() = %d\n", foo()); // eval foo(), exp: 42
+ printf("at global scope: func() = %d\n", func()); // eval func(), exp: 1
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/namespace/ns.h b/packages/Python/lldbsuite/test/lang/cpp/namespace/ns.h
new file mode 100644
index 000000000000..a07b600efa30
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/namespace/ns.h
@@ -0,0 +1,36 @@
+//===-- ns.h ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <stdio.h>
+
+void test_lookup_at_global_scope();
+void test_lookup_at_file_scope();
+void test_lookup_before_using_directive();
+void test_lookup_after_using_directive();
+int func(int a);
+namespace A {
+ int foo();
+ int func(int a);
+ inline int func()
+ {
+ printf("A::func()\n");
+ return 3;
+ }
+ inline int func2()
+ {
+ printf("A::func2()\n");
+ return 3;
+ }
+ void test_lookup_at_ns_scope();
+ namespace B {
+ int func();
+ void test_lookup_at_nested_ns_scope();
+ void test_lookup_at_nested_ns_scope_after_using();
+ }
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/namespace/ns2.cpp b/packages/Python/lldbsuite/test/lang/cpp/namespace/ns2.cpp
new file mode 100644
index 000000000000..04046ad9b7f4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/namespace/ns2.cpp
@@ -0,0 +1,65 @@
+//===-- ns2.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "ns.h"
+
+static int func()
+{
+ printf("static m2.cpp func()\n");
+ return 2;
+}
+void test_lookup_at_file_scope()
+{
+ // BP_file_scope
+ printf("at file scope: func() = %d\n", func()); // eval func(), exp: 2
+ printf("at file scope: func(10) = %d\n", func(10)); // eval func(10), exp: 11
+}
+namespace A {
+ namespace B {
+ int func()
+ {
+ printf("A::B::func()\n");
+ return 4;
+ }
+ void test_lookup_at_nested_ns_scope()
+ {
+ // BP_nested_ns_scope
+ printf("at nested ns scope: func() = %d\n", func()); // eval func(), exp: 4
+
+ //printf("func(10) = %d\n", func(10)); // eval func(10), exp: 13
+ // NOTE: Under the rules of C++, this test would normally get an error
+ // because A::B::func() hides A::func(), but lldb intentionally
+ // disobeys these rules so that the intended overload can be found
+ // by only removing duplicates if they have the same type.
+ }
+ void test_lookup_at_nested_ns_scope_after_using()
+ {
+ // BP_nested_ns_scope_after_using
+ using A::func;
+ printf("at nested ns scope after using: func() = %d\n", func()); // eval func(), exp: 3
+ }
+ }
+}
+int A::foo()
+{
+ printf("A::foo()\n");
+ return 42;
+}
+int A::func(int a)
+{
+ printf("A::func(int)\n");
+ return a + 3;
+}
+void A::test_lookup_at_ns_scope()
+{
+ // BP_ns_scope
+ printf("at nested ns scope: func() = %d\n", func()); // eval func(), exp: 3
+ printf("at nested ns scope: func(10) = %d\n", func(10)); // eval func(10), exp: 13
+ printf("at nested ns scope: foo() = %d\n", foo()); // eval foo(), exp: 42
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/namespace/ns3.cpp b/packages/Python/lldbsuite/test/lang/cpp/namespace/ns3.cpp
new file mode 100644
index 000000000000..10b0df784225
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/namespace/ns3.cpp
@@ -0,0 +1,27 @@
+//===-- ns3.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "ns.h"
+extern int func();
+
+// Note: the following function must be before the using.
+void test_lookup_before_using_directive()
+{
+ // BP_before_using_directive
+ printf("before using directive: func() = %d\n", func()); // eval func(), exp: 1
+}
+using namespace A;
+void test_lookup_after_using_directive()
+{
+ // BP_after_using_directive
+ //printf("func() = %d\n", func()); // eval func(), exp: error, amiguous
+ printf("after using directive: func2() = %d\n", func2()); // eval func2(), exp: 3
+ printf("after using directive: ::func() = %d\n", ::func()); // eval ::func(), exp: 1
+ printf("after using directive: B::func() = %d\n", B::func()); // eval B::func(), exp: 4
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/nsimport/Makefile b/packages/Python/lldbsuite/test/lang/cpp/nsimport/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/nsimport/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/nsimport/TestCppNsImport.py b/packages/Python/lldbsuite/test/lang/cpp/nsimport/TestCppNsImport.py
new file mode 100644
index 000000000000..97e9e27a6e98
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/nsimport/TestCppNsImport.py
@@ -0,0 +1,101 @@
+"""
+Tests imported namespaces in C++.
+"""
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TestCppNsImport(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureFreeBSD("llvm.org/pr25925")
+ @expectedFailureGcc(None, ['>=', '4.9'])
+ def test_with_run_command(self):
+ """Tests imported namespaces in C++."""
+ self.build()
+
+ # Get main source file
+ src_file = "main.cpp"
+ src_file_spec = lldb.SBFileSpec(src_file)
+ self.assertTrue(src_file_spec.IsValid(), "Main source file")
+
+ # Get the path of the executable
+ cwd = os.getcwd()
+ exe_file = "a.out"
+ exe_path = os.path.join(cwd, exe_file)
+
+ # Load the executable
+ target = self.dbg.CreateTarget(exe_path)
+ self.assertTrue(target.IsValid(), VALID_TARGET)
+
+ # Break on main function
+ break_0 = target.BreakpointCreateBySourceRegex("// break 0", src_file_spec)
+ self.assertTrue(break_0.IsValid() and break_0.GetNumLocations() >= 1, VALID_BREAKPOINT)
+ break_1 = target.BreakpointCreateBySourceRegex("// break 1", src_file_spec)
+ self.assertTrue(break_1.IsValid() and break_1.GetNumLocations() >= 1, VALID_BREAKPOINT)
+
+ # Launch the process
+ args = None
+ env = None
+ process = target.LaunchSimple(args, env, self.get_process_working_directory())
+ self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
+
+ # Get the thread of the process
+ self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
+ thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+
+ # Get current fream of the thread at the breakpoint
+ frame = thread.GetSelectedFrame()
+
+ # Test imported namespaces
+ test_result = frame.EvaluateExpression("n")
+ self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 1, "n = 1")
+
+ test_result = frame.EvaluateExpression("N::n")
+ self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 1, "N::n = 1")
+
+ test_result = frame.EvaluateExpression("nested")
+ self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 3, "nested = 3")
+
+ test_result = frame.EvaluateExpression("anon")
+ self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 2, "anon = 2")
+
+ test_result = frame.EvaluateExpression("global")
+ self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 4, "global = 4")
+
+ test_result = frame.EvaluateExpression("fun_var")
+ self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 9, "fun_var = 9")
+
+ test_result = frame.EvaluateExpression("Fun::fun_var")
+ self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 0, "Fun::fun_var = 0")
+
+ test_result = frame.EvaluateExpression("not_imported")
+ self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 35, "not_imported = 35")
+
+ # Currently there is no way to distinguish between "::imported" and "imported" in ClangExpressionDeclMap so this fails
+ #test_result = frame.EvaluateExpression("::imported")
+ #self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 89, "::imported = 89")
+
+ test_result = frame.EvaluateExpression("Imported::imported")
+ self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 99, "Imported::imported = 99")
+
+ test_result = frame.EvaluateExpression("imported")
+ self.assertTrue(test_result.IsValid() and test_result.GetError().Fail(), "imported is ambiguous")
+
+ test_result = frame.EvaluateExpression("single")
+ self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 3, "single = 3")
+
+ # Continue to second breakpoint
+ process.Continue()
+
+ # Get the thread of the process
+ self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
+ thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+
+ # Get current fream of the thread at the breakpoint
+ frame = thread.GetSelectedFrame()
+
+ # Test function inside namespace
+ test_result = frame.EvaluateExpression("fun_var")
+ self.assertTrue(test_result.IsValid() and test_result.GetValueAsSigned() == 5, "fun_var = 5")
diff --git a/packages/Python/lldbsuite/test/lang/cpp/nsimport/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/nsimport/main.cpp
new file mode 100644
index 000000000000..e125ebaa2430
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/nsimport/main.cpp
@@ -0,0 +1,72 @@
+namespace N
+{
+ int n;
+}
+
+namespace
+{
+ int anon;
+}
+
+namespace Nested
+{
+ namespace
+ {
+ int nested;
+ }
+}
+
+namespace Global
+{
+ int global;
+}
+
+namespace Fun
+{
+ int fun_var;
+ int fun()
+ {
+ fun_var = 5;
+ return 0; // break 1
+ }
+}
+
+namespace Single
+{
+ int single = 3;
+}
+
+namespace NotImportedBefore
+{
+ int not_imported = 45;
+}
+
+using namespace Global;
+
+int not_imported = 35;
+int fun_var = 9;
+
+namespace NotImportedAfter
+{
+ int not_imported = 55;
+}
+
+namespace Imported
+{
+ int imported = 99;
+}
+
+int imported = 89;
+
+int main()
+{
+ using namespace N;
+ using namespace Nested;
+ using namespace Imported;
+ using Single::single;
+ n = 1;
+ anon = 2;
+ nested = 3;
+ global = 4;
+ return Fun::fun(); // break 0
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/Makefile b/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/Makefile
new file mode 100644
index 000000000000..a8d5c4eb0268
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp static-a.cpp static-b.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/TestOverloadedFunctions.py b/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/TestOverloadedFunctions.py
new file mode 100644
index 000000000000..d485dcd0f652
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/TestOverloadedFunctions.py
@@ -0,0 +1,36 @@
+"""
+Tests that functions with the same name are resolved correctly.
+"""
+
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class CPPStaticMethodsTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ TestBase.setUp(self)
+ self.line = line_number('main.cpp', '// breakpoint')
+
+ @expectedFailureWindows("llvm.org/pr24489: Name lookup not working correctly on Windows")
+ def test_with_run_command(self):
+ """Test that functions with the same name are resolved correctly"""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("process launch", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list",
+ STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped', 'stop reason = breakpoint'])
+
+ self.expect("expression -- Dump(myB)",
+ startstr = "(int) $0 = 2")
+
+ self.expect("expression -- Static()",
+ startstr = "(int) $1 = 1")
diff --git a/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/main.cpp
new file mode 100644
index 000000000000..250e2cd1d96c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/main.cpp
@@ -0,0 +1,43 @@
+#include <stdio.h>
+
+struct A {
+ int aa;
+ char ab;
+};
+
+struct B {
+ int ba;
+ int bb;
+};
+
+struct C {
+ int ca;
+ int cb;
+};
+
+int Dump (A &a)
+{
+ return 1;
+}
+
+int Dump (B &b)
+{
+ return 2;
+}
+
+int Dump (C &c)
+{
+ return 3;
+}
+
+extern int CallStaticA();
+extern int CallStaticB();
+
+int main()
+{
+ A myA;
+ B myB;
+ C myC;
+
+ printf("%d\n", CallStaticA() + CallStaticB()); // breakpoint
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/static-a.cpp b/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/static-a.cpp
new file mode 100644
index 000000000000..7250fa4bed5e
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/static-a.cpp
@@ -0,0 +1,9 @@
+static int Static()
+{
+ return 1;
+}
+
+int CallStaticA()
+{
+ return Static();
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/static-b.cpp b/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/static-b.cpp
new file mode 100644
index 000000000000..90a20f69e6db
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/overloaded-functions/static-b.cpp
@@ -0,0 +1,9 @@
+static int Static()
+{
+ return 1;
+}
+
+int CallStaticB()
+{
+ return Static();
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/rdar12991846/Makefile b/packages/Python/lldbsuite/test/lang/cpp/rdar12991846/Makefile
new file mode 100644
index 000000000000..1476447db355
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/rdar12991846/Makefile
@@ -0,0 +1,8 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+CFLAGS := -g -O0 -std=c++11
+
+clean: OBJECTS+=$(wildcard main.d.*)
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/rdar12991846/TestRdar12991846.py b/packages/Python/lldbsuite/test/lang/cpp/rdar12991846/TestRdar12991846.py
new file mode 100644
index 000000000000..636a82b425da
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/rdar12991846/TestRdar12991846.py
@@ -0,0 +1,85 @@
+# coding=utf8
+"""
+Test that the expression parser returns proper Unicode strings.
+"""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+# this test case fails because of rdar://12991846
+# the expression parser does not deal correctly with Unicode expressions
+# e.g.
+#(lldb) expr L"Hello"
+#(const wchar_t [6]) $0 = {
+# [0] = \0\0\0\0
+# [1] = \0\0\0\0
+# [2] = \0\0\0\0
+# [3] = \0\0\0\0
+# [4] = H\0\0\0
+# [5] = e\0\0\0
+#}
+
+class Rdar12991846TestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @unittest2.expectedFailure("rdar://18684408")
+ @expectedFailureWindows("llvm.org/pr24489: Name lookup not working correctly on Windows")
+ def test_expr1(self):
+ """Test that the expression parser returns proper Unicode strings."""
+ self.build()
+ self.rdar12991846(expr=1)
+
+ @unittest2.expectedFailure("rdar://18684408")
+ @expectedFailureWindows("llvm.org/pr24489: Name lookup not working correctly on Windows")
+ def test_expr2(self):
+ """Test that the expression parser returns proper Unicode strings."""
+ self.build()
+ self.rdar12991846(expr=2)
+
+ @unittest2.expectedFailure("rdar://18684408")
+ @expectedFailureWindows("llvm.org/pr24489: Name lookup not working correctly on Windows")
+ def test_expr3(self):
+ """Test that the expression parser returns proper Unicode strings."""
+ self.build()
+ self.rdar12991846(expr=3)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break for main.cpp.
+ self.source = 'main.cpp'
+ self.line = line_number(self.source, '// Set break point at this line.')
+
+ def rdar12991846(self, expr=None):
+ """Test that the expression parser returns proper Unicode strings."""
+ if self.getArchitecture() in ['i386']:
+ self.skipTest("Skipping because this test is known to crash on i386")
+
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Break on the struct declration statement in main.cpp.
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ if not process:
+ self.fail("SBTarget.Launch() failed")
+
+ if expr == 1: self.expect('expression L"hello"', substrs = ['hello'])
+
+ if expr == 2: self.expect('expression u"hello"', substrs = ['hello'])
+
+ if expr == 3: self.expect('expression U"hello"', substrs = ['hello'])
diff --git a/packages/Python/lldbsuite/test/lang/cpp/rdar12991846/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/rdar12991846/main.cpp
new file mode 100644
index 000000000000..fda951a78991
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/rdar12991846/main.cpp
@@ -0,0 +1,21 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+
+int main (int argc, char const *argv[])
+{
+ auto cs16 = u"hello world ྒྙྐ";
+ auto cs32 = U"hello world ྒྙྐ";
+ char16_t *s16 = (char16_t *)u"ﺸﺵۻ";
+ char32_t *s32 = (char32_t *)U"ЕЙРГЖО";
+ s32 = nullptr; // Set break point at this line.
+ s32 = (char32_t *)U"෴";
+ s16 = (char16_t *)u"色ハ匂ヘト散リヌルヲ";
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/rvalue-references/Makefile b/packages/Python/lldbsuite/test/lang/cpp/rvalue-references/Makefile
new file mode 100644
index 000000000000..3a1d8a579350
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/rvalue-references/Makefile
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+CXXFLAGS += -std=c++11
+
+include $(LEVEL)/Makefile.rules \ No newline at end of file
diff --git a/packages/Python/lldbsuite/test/lang/cpp/rvalue-references/TestRvalueReferences.py b/packages/Python/lldbsuite/test/lang/cpp/rvalue-references/TestRvalueReferences.py
new file mode 100644
index 000000000000..d02c34ecb0fe
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/rvalue-references/TestRvalueReferences.py
@@ -0,0 +1,49 @@
+"""
+Tests that rvalue references are supported in C++
+"""
+
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class RvalueReferencesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ #rdar://problem/11479676
+ @expectedFailureIcc("ICC (13.1, 14-beta) do not emit DW_TAG_rvalue_reference_type.")
+ @expectedFailureWindows("llvm.org/pr24489: Name lookup not working correctly on Windows")
+ def test_with_run_command(self):
+ """Test that rvalues are supported in the C++ expression parser"""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ self.set_breakpoint(line_number('main.cpp', '// breakpoint 1'))
+ self.set_breakpoint(line_number('main.cpp', '// breakpoint 2'))
+
+ self.runCmd("process launch", RUN_SUCCEEDED)
+
+ # Note that clang as of r187480 doesn't emit DW_TAG_const_type, unlike gcc 4.8.1
+ # With gcc 4.8.1, lldb reports the type as (int &&const)
+ self.expect("frame variable i",
+ startstr = "(int &&",
+ substrs = ["i = 0x", "&i = 3"])
+
+ self.expect("expression -- i",
+ startstr = "(int) ",
+ substrs = ["3"])
+
+ self.expect("breakpoint delete 1")
+
+ self.runCmd("process continue")
+
+ self.expect("expression -- foo(2)")
+
+ self.expect("expression -- int &&j = 3; foo(j)",
+ error = True)
+
+ self.expect("expression -- int &&k = 6; k",
+ startstr = "(int) $1 = 6")
+
+ def set_breakpoint(self, line):
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", line, num_expected_locations=1, loc_exact=True)
diff --git a/packages/Python/lldbsuite/test/lang/cpp/rvalue-references/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/rvalue-references/main.cpp
new file mode 100644
index 000000000000..6da34c73f101
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/rvalue-references/main.cpp
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+void foo (int &&i)
+{
+ printf("%d\n", i); // breakpoint 1
+}
+
+int main()
+{
+ foo(3);
+ return 0; // breakpoint 2
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/scope/Makefile b/packages/Python/lldbsuite/test/lang/cpp/scope/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/scope/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/scope/TestCppScope.py b/packages/Python/lldbsuite/test/lang/cpp/scope/TestCppScope.py
new file mode 100644
index 000000000000..66d4a1591575
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/scope/TestCppScope.py
@@ -0,0 +1,67 @@
+"""
+Test scopes in C++.
+"""
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TestCppScopes(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @expectedFailureDarwin
+ @expectedFailureWindows("llvm.org/pr24764")
+ def test_with_run_command(self):
+ self.build()
+
+ # Get main source file
+ src_file = "main.cpp"
+ src_file_spec = lldb.SBFileSpec(src_file)
+ self.assertTrue(src_file_spec.IsValid(), "Main source file")
+
+ # Get the path of the executable
+ cwd = os.getcwd()
+ exe_file = "a.out"
+ exe_path = os.path.join(cwd, exe_file)
+
+ # Load the executable
+ target = self.dbg.CreateTarget(exe_path)
+ self.assertTrue(target.IsValid(), VALID_TARGET)
+
+ # Break on main function
+ main_breakpoint = target.BreakpointCreateBySourceRegex("// break here", src_file_spec)
+ self.assertTrue(main_breakpoint.IsValid() and main_breakpoint.GetNumLocations() >= 1, VALID_BREAKPOINT)
+
+ # Launch the process
+ args = None
+ env = None
+ process = target.LaunchSimple(args, env, self.get_process_working_directory())
+ self.assertTrue(process.IsValid(), PROCESS_IS_VALID)
+
+ # Get the thread of the process
+ self.assertTrue(process.GetState() == lldb.eStateStopped, PROCESS_STOPPED)
+ thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+
+ # Get current fream of the thread at the breakpoint
+ frame = thread.GetSelectedFrame()
+
+ # Test result for scopes of variables
+
+ global_variables = frame.GetVariables(True, True, True, False)
+ global_variables_assert = {
+ 'A::a': 1111,
+ 'B::a': 2222,
+ 'C::a': 3333,
+ '::a': 4444,
+ 'a': 4444
+ }
+
+ self.assertTrue(global_variables.GetSize() == 4, "target variable returns all variables")
+ for variable in global_variables:
+ name = variable.GetName()
+ self.assertTrue(name in global_variables_assert, "target variable returns wrong variable " + name)
+
+ for name in global_variables_assert:
+ value = frame.EvaluateExpression(name)
+ assert_value = global_variables_assert[name]
+ self.assertTrue(value.IsValid() and value.GetValueAsSigned() == assert_value, name + " = " + str(assert_value))
diff --git a/packages/Python/lldbsuite/test/lang/cpp/scope/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/scope/main.cpp
new file mode 100644
index 000000000000..da5d7ed529d1
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/scope/main.cpp
@@ -0,0 +1,25 @@
+class A {
+public:
+ static int a;
+ int b;
+};
+
+class B {
+public:
+ static int a;
+ int b;
+};
+
+struct C {
+ static int a;
+};
+
+int A::a = 1111;
+int B::a = 2222;
+int C::a = 3333;
+int a = 4444;
+
+int main() // break here
+{
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/signed_types/Makefile b/packages/Python/lldbsuite/test/lang/cpp/signed_types/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/signed_types/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/signed_types/TestSignedTypes.py b/packages/Python/lldbsuite/test/lang/cpp/signed_types/TestSignedTypes.py
new file mode 100644
index 000000000000..51e6d4579e28
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/signed_types/TestSignedTypes.py
@@ -0,0 +1,60 @@
+"""
+Test that variables with signed types display correctly.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import re
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class UnsignedTypesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.source = 'main.cpp'
+ self.line = line_number(self.source, '// Set break point at this line.')
+
+ def test(self):
+ """Test that variables with signed types display correctly."""
+ self.build()
+
+ # Run in synchronous mode
+ self.dbg.SetAsync(False)
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget("a.out")
+ self.assertTrue(target, VALID_TARGET)
+
+ lldbutil.run_break_set_by_file_and_line (self, self.source, self.line, num_expected_locations=1, loc_exact=True)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped', 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # Execute the assignment statement.
+ self.runCmd("thread step-over")
+
+ # Test that signed types display correctly.
+ self.expect("frame variable --show-types --no-args", VARIABLES_DISPLAYED_CORRECTLY,
+ patterns = ["\((short int|short)\) the_signed_short = 99",
+ "\((signed char|char)\) the_signed_char = 'c'"],
+ substrs = ["(int) the_signed_int = 99",
+ "(long) the_signed_long = 99",
+ "(long long) the_signed_long_long = 99"])
diff --git a/packages/Python/lldbsuite/test/lang/cpp/signed_types/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/signed_types/main.cpp
new file mode 100644
index 000000000000..dbf3606aeba8
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/signed_types/main.cpp
@@ -0,0 +1,33 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <stdio.h>
+
+int main (int argc, char const *argv[])
+{
+ char the_char = 'c';
+ short the_short = 'c';
+ wchar_t the_wchar_t = 'c';
+ int the_int = 'c';
+ long the_long = 'c';
+ long long the_long_long = 'c';
+
+ signed char the_signed_char = 'c';
+ signed short the_signed_short = 'c';
+ signed int the_signed_int = 'c';
+ signed long the_signed_long = 'c';
+ signed long long the_signed_long_long = 'c';
+ puts(""); // Set break point at this line.
+ return the_char - the_signed_char +
+ the_short - the_signed_short +
+ the_int - the_signed_int +
+ the_long - the_signed_long +
+ the_long_long - the_signed_long_long; //// break $source:$line; c
+ //// var the_int
+ //// val -set 22 1
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/static_members/Makefile b/packages/Python/lldbsuite/test/lang/cpp/static_members/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/static_members/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/static_members/TestCPPStaticMembers.py b/packages/Python/lldbsuite/test/lang/cpp/static_members/TestCPPStaticMembers.py
new file mode 100644
index 000000000000..1c41b1b6f571
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/static_members/TestCPPStaticMembers.py
@@ -0,0 +1,59 @@
+"""
+Tests that C++ member and static variables have correct layout and scope.
+"""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class CPPStaticMembersTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @unittest2.expectedFailure # llvm.org/pr15401
+ @expectedFailureWindows("llvm.org/pr21765")
+ def test_with_run_command(self):
+ """Test that member variables have the correct layout, scope and qualifiers when stopped inside and outside C++ methods"""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ self.set_breakpoint(line_number('main.cpp', '// breakpoint 1'))
+ self.set_breakpoint(line_number('main.cpp', '// breakpoint 2'))
+
+ self.runCmd("process launch", RUN_SUCCEEDED)
+ self.expect("expression my_a.access()",
+ startstr = "(long) $0 = 10")
+
+ self.expect("expression my_a.m_a",
+ startstr = "(short) $1 = 1")
+
+ # Note: SymbolFileDWARF::ParseChildMembers doesn't call AddFieldToRecordType, consistent with clang's AST layout.
+ self.expect("expression my_a.s_d",
+ startstr = "(int) $2 = 4")
+
+ self.expect("expression my_a.s_b",
+ startstr = "(long) $3 = 2")
+
+ self.expect("expression A::s_b",
+ startstr = "(long) $4 = 2")
+
+ # should not be available in global scope
+ self.expect("expression s_d",
+ startstr = "error: use of undeclared identifier 's_d'")
+
+ self.runCmd("process continue")
+ self.expect("expression m_c",
+ startstr = "(char) $5 = \'\\x03\'")
+
+ self.expect("expression s_b",
+ startstr = "(long) $6 = 2")
+
+ self.runCmd("process continue")
+
+ def set_breakpoint(self, line):
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", line, num_expected_locations=1, loc_exact=False)
diff --git a/packages/Python/lldbsuite/test/lang/cpp/static_members/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/static_members/main.cpp
new file mode 100644
index 000000000000..7ccc2f9a328b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/static_members/main.cpp
@@ -0,0 +1,36 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <stdio.h>
+
+struct A
+{
+ short m_a;
+ static long s_b;
+ char m_c;
+ static int s_d;
+
+ long access() {
+ return m_a + s_b + m_c + s_d; // breakpoint 2
+ }
+};
+
+long A::s_b = 2;
+int A::s_d = 4;
+
+int main()
+{
+ A my_a;
+ my_a.m_a = 1;
+ my_a.m_c = 3;
+
+ my_a.access(); // breakpoint 1
+ return 0;
+}
+
diff --git a/packages/Python/lldbsuite/test/lang/cpp/static_methods/Makefile b/packages/Python/lldbsuite/test/lang/cpp/static_methods/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/static_methods/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/static_methods/TestCPPStaticMethods.py b/packages/Python/lldbsuite/test/lang/cpp/static_methods/TestCPPStaticMethods.py
new file mode 100644
index 000000000000..dba556431e39
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/static_methods/TestCPPStaticMethods.py
@@ -0,0 +1,36 @@
+"""
+Tests expressions that distinguish between static and non-static methods.
+"""
+
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class CPPStaticMethodsTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ TestBase.setUp(self)
+ self.line = line_number('main.cpp', '// Break at this line')
+
+ @expectedFailureWindows
+ def test_with_run_command(self):
+ """Test that static methods are properly distinguished from regular methods"""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("process launch", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list",
+ STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped', 'stop reason = breakpoint'])
+
+ self.expect("expression -- A::getStaticValue()",
+ startstr = "(int) $0 = 5")
+
+ self.expect("expression -- my_a.getMemberValue()",
+ startstr = "(int) $1 = 3")
diff --git a/packages/Python/lldbsuite/test/lang/cpp/static_methods/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/static_methods/main.cpp
new file mode 100644
index 000000000000..5141a407d111
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/static_methods/main.cpp
@@ -0,0 +1,38 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <stdio.h>
+
+class A
+{
+public:
+ static int getStaticValue();
+ int getMemberValue();
+ int a;
+};
+
+int A::getStaticValue()
+{
+ return 5;
+}
+
+int A::getMemberValue()
+{
+ return a;
+}
+
+int main()
+{
+ A my_a;
+
+ my_a.a = 3;
+
+ printf("%d\n", A::getStaticValue()); // Break at this line
+ printf("%d\n", my_a.getMemberValue());
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/stl/Makefile b/packages/Python/lldbsuite/test/lang/cpp/stl/Makefile
new file mode 100644
index 000000000000..f61a6300a994
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/stl/Makefile
@@ -0,0 +1,15 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+CFLAGS := -g -O0
+
+clean: OBJECTS+=$(wildcard main.d.*)
+
+# clang-3.5+ outputs FullDebugInfo by default for Darwin/FreeBSD
+# targets. Other targets do not, which causes this test to fail.
+# This flag enables FullDebugInfo for all targets.
+ifneq (,$(findstring clang,$(CC)))
+ CFLAGS_EXTRAS += -fno-limit-debug-info
+endif
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/stl/TestSTL.py b/packages/Python/lldbsuite/test/lang/cpp/stl/TestSTL.py
new file mode 100644
index 000000000000..6dba1398947e
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/stl/TestSTL.py
@@ -0,0 +1,118 @@
+"""
+Test some expressions involving STL data types.
+"""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class STLTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.source = 'main.cpp'
+ self.line = line_number(self.source, '// Set break point at this line.')
+
+ # rdar://problem/10400981
+ @unittest2.expectedFailure
+ def test(self):
+ """Test some expressions involving STL data types."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # The following two lines, if uncommented, will enable loggings.
+ #self.ci.HandleCommand("log enable -f /tmp/lldb.log lldb default", res)
+ #self.assertTrue(res.Succeeded())
+
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # rdar://problem/8543077
+ # test/stl: clang built binaries results in the breakpoint locations = 3,
+ # is this a problem with clang generated debug info?
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # Stop at 'std::string hello_world ("Hello World!");'.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['main.cpp:%d' % self.line,
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # Now try some expressions....
+
+ self.runCmd('expr for (int i = 0; i < hello_world.length(); ++i) { (void)printf("%c\\n", hello_world[i]); }')
+
+ # rdar://problem/10373783
+ # rdar://problem/10400981
+ self.expect('expr associative_array.size()',
+ substrs = [' = 3'])
+ self.expect('expr associative_array.count(hello_world)',
+ substrs = [' = 1'])
+ self.expect('expr associative_array[hello_world]',
+ substrs = [' = 1'])
+ self.expect('expr associative_array["hello"]',
+ substrs = [' = 2'])
+
+ @expectedFailureIcc # icc 13.1 and 14-beta do not emit DW_TAG_template_type_parameter
+ @add_test_categories(['pyapi'])
+ def test_SBType_template_aspects(self):
+ """Test APIs for getting template arguments from an SBType."""
+ self.build()
+ exe = os.path.join(os.getcwd(), 'a.out')
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Create the breakpoint inside function 'main'.
+ breakpoint = target.BreakpointCreateByLocation(self.source, self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # Get Frame #0.
+ self.assertTrue(process.GetState() == lldb.eStateStopped)
+ thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+ self.assertTrue(thread.IsValid(), "There should be a thread stopped due to breakpoint condition")
+ frame0 = thread.GetFrameAtIndex(0)
+
+ # Get the type for variable 'associative_array'.
+ associative_array = frame0.FindVariable('associative_array')
+ self.DebugSBValue(associative_array)
+ self.assertTrue(associative_array, VALID_VARIABLE)
+ map_type = associative_array.GetType()
+ self.DebugSBType(map_type)
+ self.assertTrue(map_type, VALID_TYPE)
+ num_template_args = map_type.GetNumberOfTemplateArguments()
+ self.assertTrue(num_template_args > 0)
+
+ # We expect the template arguments to contain at least 'string' and 'int'.
+ expected_types = { 'string': False, 'int': False }
+ for i in range(num_template_args):
+ t = map_type.GetTemplateArgumentType(i)
+ self.DebugSBType(t)
+ self.assertTrue(t, VALID_TYPE)
+ name = t.GetName()
+ if 'string' in name:
+ expected_types['string'] = True
+ elif 'int' == name:
+ expected_types['int'] = True
+
+ # Check that both entries of the dictionary have 'True' as the value.
+ self.assertTrue(all(expected_types.values()))
diff --git a/packages/Python/lldbsuite/test/lang/cpp/stl/TestStdCXXDisassembly.py b/packages/Python/lldbsuite/test/lang/cpp/stl/TestStdCXXDisassembly.py
new file mode 100644
index 000000000000..d7435c467274
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/stl/TestStdCXXDisassembly.py
@@ -0,0 +1,111 @@
+"""
+Test the lldb disassemble command on lib stdc++.
+"""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class StdCXXDisassembleTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.cpp', '// Set break point at this line.')
+
+ # rdar://problem/8504895
+ # Crash while doing 'disassemble -n "-[NSNumber descriptionWithLocale:]"
+ @unittest2.skipIf(TestBase.skipLongRunningTest(), "Skip this long running test")
+ def test_stdcxx_disasm(self):
+ """Do 'disassemble' on each and every 'Code' symbol entry from the std c++ lib."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # rdar://problem/8543077
+ # test/stl: clang built binaries results in the breakpoint locations = 3,
+ # is this a problem with clang generated debug info?
+ #
+ # Break on line 13 of main.cpp.
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # Now let's get the target as well as the process objects.
+ target = self.dbg.GetSelectedTarget()
+ process = target.GetProcess()
+
+ # The process should be in a 'stopped' state.
+ self.expect(str(process), STOPPED_DUE_TO_BREAKPOINT, exe=False,
+ substrs = ["a.out",
+ "stopped"])
+
+ # Disassemble the functions on the call stack.
+ self.runCmd("thread backtrace")
+ thread = process.GetThreadAtIndex(0)
+ depth = thread.GetNumFrames()
+ for i in range(depth - 1):
+ frame = thread.GetFrameAtIndex(i)
+ function = frame.GetFunction()
+ if function.GetName():
+ self.runCmd("disassemble -n '%s'" % function.GetName())
+
+ lib_stdcxx = "FAILHORRIBLYHERE"
+ # Iterate through the available modules, looking for stdc++ library...
+ for i in range(target.GetNumModules()):
+ module = target.GetModuleAtIndex(i)
+ fs = module.GetFileSpec()
+ if (fs.GetFilename().startswith("libstdc++") or fs.GetFilename().startswith("libc++")):
+ lib_stdcxx = str(fs)
+ break
+
+ # At this point, lib_stdcxx is the full path to the stdc++ library and
+ # module is the corresponding SBModule.
+
+ self.expect(lib_stdcxx, "Libraray StdC++ is located", exe=False,
+ substrs = ["lib"])
+
+ self.runCmd("image dump symtab '%s'" % lib_stdcxx)
+ raw_output = self.res.GetOutput()
+ # Now, look for every 'Code' symbol and feed its load address into the
+ # command: 'disassemble -s load_address -e end_address', where the
+ # end_address is taken from the next consecutive 'Code' symbol entry's
+ # load address.
+ #
+ # The load address column comes after the file address column, with both
+ # looks like '0xhhhhhhhh', i.e., 8 hexadecimal digits.
+ codeRE = re.compile(r"""
+ \ Code\ {9} # ' Code' followed by 9 SPCs,
+ 0x[0-9a-f]{16} # the file address column, and
+ \ # a SPC, and
+ (0x[0-9a-f]{16}) # the load address column, and
+ .* # the rest.
+ """, re.VERBOSE)
+ # Maintain a start address variable; if we arrive at a consecutive Code
+ # entry, then the load address of the that entry is fed as the end
+ # address to the 'disassemble -s SA -e LA' command.
+ SA = None
+ for line in raw_output.split(os.linesep):
+ match = codeRE.search(line)
+ if match:
+ LA = match.group(1)
+ if self.TraceOn():
+ print("line:", line)
+ print("load address:", LA)
+ print("SA:", SA)
+ if SA and LA:
+ if int(LA, 16) > int(SA, 16):
+ self.runCmd("disassemble -s %s -e %s" % (SA, LA))
+ SA = LA
+ else:
+ # This entry is not a Code entry. Reset SA = None.
+ SA = None
diff --git a/packages/Python/lldbsuite/test/lang/cpp/stl/cmds.txt b/packages/Python/lldbsuite/test/lang/cpp/stl/cmds.txt
new file mode 100644
index 000000000000..9c9c2e3db57b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/stl/cmds.txt
@@ -0,0 +1,3 @@
+b main.cpp:6
+continue
+var
diff --git a/packages/Python/lldbsuite/test/lang/cpp/stl/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/stl/main.cpp
new file mode 100644
index 000000000000..cfdb7b2d3db5
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/stl/main.cpp
@@ -0,0 +1,30 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <cstdio>
+#include <iostream>
+#include <string>
+#include <map>
+int main (int argc, char const *argv[])
+{
+ std::string hello_world ("Hello World!");
+ std::cout << hello_world << std::endl;
+ std::cout << hello_world.length() << std::endl;
+ std::cout << hello_world[11] << std::endl;
+
+ std::map<std::string, int> associative_array;
+ std::cout << "size of upon construction associative_array: " << associative_array.size() << std::endl;
+ associative_array[hello_world] = 1;
+ associative_array["hello"] = 2;
+ associative_array["world"] = 3;
+
+ std::cout << "size of associative_array: " << associative_array.size() << std::endl;
+ printf("associative_array[\"hello\"]=%d\n", associative_array["hello"]);
+
+ printf("before returning....\n"); // Set break point at this line.
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/this/Makefile b/packages/Python/lldbsuite/test/lang/cpp/this/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/this/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/this/TestCPPThis.py b/packages/Python/lldbsuite/test/lang/cpp/this/TestCPPThis.py
new file mode 100644
index 000000000000..07cc2e8e9788
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/this/TestCPPThis.py
@@ -0,0 +1,53 @@
+"""
+Tests that C++ member and static variables are available where they should be.
+"""
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class CPPThisTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ #rdar://problem/9962849
+ @expectedFailureGcc # llvm.org/pr15439 The 'this' pointer isn't available during expression evaluation when stopped in an inlined member function.
+ @expectedFailureIcc # ICC doesn't emit correct DWARF inline debug info for inlined member functions
+ @expectedFailureWindows("llvm.org/pr24489: Name lookup not working correctly on Windows")
+ @expectedFailureWindows("llvm.org/pr24490: We shouldn't be using platform-specific names like `getpid` in tests")
+ @expectedFlakeyClang(bugnumber='llvm.org/pr23012', compiler_version=['>=','3.6']) # failed with totclang - clang3.7
+ def test_with_run_command(self):
+ """Test that the appropriate member variables are available when stopped in C++ static, inline, and const methods"""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ self.set_breakpoint(line_number('main.cpp', '// breakpoint 1'))
+ self.set_breakpoint(line_number('main.cpp', '// breakpoint 2'))
+ self.set_breakpoint(line_number('main.cpp', '// breakpoint 3'))
+ self.set_breakpoint(line_number('main.cpp', '// breakpoint 4'))
+
+ self.runCmd("process launch", RUN_SUCCEEDED)
+
+ self.expect("expression -- m_a = 2",
+ startstr = "(int) $0 = 2")
+
+ self.runCmd("process continue")
+
+ # This would be disallowed if we enforced const. But we don't.
+ self.expect("expression -- m_a = 2",
+ startstr = "(int) $1 = 2")
+
+ self.expect("expression -- (int)getpid(); m_a",
+ startstr = "(int) $2 = 2")
+
+ self.runCmd("process continue")
+
+ self.expect("expression -- s_a",
+ startstr = "(int) $3 = 5")
+
+ self.runCmd("process continue")
+
+ self.expect("expression -- m_a",
+ startstr = "(int) $4 = 2")
+
+ def set_breakpoint(self, line):
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", line, num_expected_locations=1, loc_exact=False)
diff --git a/packages/Python/lldbsuite/test/lang/cpp/this/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/this/main.cpp
new file mode 100644
index 000000000000..4448a5cadf57
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/this/main.cpp
@@ -0,0 +1,53 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <stdio.h>
+
+template <class T> class A
+{
+public:
+ void accessMember(T a);
+ T accessMemberConst() const;
+ static int accessStaticMember();
+
+ void accessMemberInline(T a) __attribute__ ((always_inline))
+ {
+ m_a = a; // breakpoint 4
+ }
+
+ T m_a;
+ static int s_a;
+};
+
+template <class T> int A<T>::s_a = 5;
+
+template <class T> void A<T>::accessMember(T a)
+{
+ m_a = a; // breakpoint 1
+}
+
+template <class T> T A<T>::accessMemberConst() const
+{
+ return m_a; // breakpoint 2
+}
+
+template <class T> int A<T>::accessStaticMember()
+{
+ return s_a; // breakpoint 3
+}
+
+int main()
+{
+ A<int> my_a;
+
+ my_a.accessMember(3);
+ my_a.accessMemberConst();
+ A<int>::accessStaticMember();
+ my_a.accessMemberInline(5);
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/unique-types/Makefile b/packages/Python/lldbsuite/test/lang/cpp/unique-types/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/unique-types/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/unique-types/TestUniqueTypes.py b/packages/Python/lldbsuite/test/lang/cpp/unique-types/TestUniqueTypes.py
new file mode 100644
index 000000000000..2cbb1a191e68
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/unique-types/TestUniqueTypes.py
@@ -0,0 +1,62 @@
+"""
+Test that template instaniations of std::vector<long> and <short> in the same module have the correct types.
+"""
+
+from __future__ import print_function
+
+
+
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class UniqueTypesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number inside main.cpp.
+ self.line = line_number("main.cpp",
+ "// Set breakpoint here to verify that std::vector 'longs' and 'shorts' have unique types.")
+
+ def test(self):
+ """Test for unique types of std::vector<long> and std::vector<short>."""
+ self.build()
+
+ compiler = self.getCompiler()
+ compiler_basename = os.path.basename(compiler)
+ if "clang" in compiler_basename and int(self.getCompilerVersion().split('.')[0]) < 3:
+ self.skipTest("rdar://problem/9173060 lldb hangs while running unique-types for clang version < 3")
+
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # Do a "frame variable --show-types longs" and verify "long" is in each line of output.
+ self.runCmd("frame variable --show-types longs")
+ output = self.res.GetOutput()
+ for x in [line.strip() for line in output.split(os.linesep)]:
+ # Skip empty line, closing brace, and messages about more variables than can be displayed.
+ if not x or x == '}' or x == '...' or "Some of your variables have more members than the debugger will show by default" in x:
+ continue
+ self.expect(x, "Expect type 'long'", exe=False,
+ substrs = ['long'])
+
+ # Do a "frame variable --show-types shorts" and verify "short" is in each line of output.
+ self.runCmd("frame variable --show-types shorts")
+ output = self.res.GetOutput()
+ for x in [line.strip() for line in output.split(os.linesep)]:
+ # Skip empty line, closing brace, and messages about more variables than can be displayed.
+ if not x or x == '}' or x == '...' or "Some of your variables have more members than the debugger will show by default" in x:
+ continue
+ self.expect(x, "Expect type 'short'", exe=False,
+ substrs = ['short'])
diff --git a/packages/Python/lldbsuite/test/lang/cpp/unique-types/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/unique-types/main.cpp
new file mode 100644
index 000000000000..c551c0e2c0d4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/unique-types/main.cpp
@@ -0,0 +1,24 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+#include <vector>
+
+#include <stdio.h>
+#include <stdint.h>
+
+int main (int argc, char const *argv[], char const *envp[])
+{
+ std::vector<long> longs;
+ std::vector<short> shorts;
+ for (int i=0; i<12; i++)
+ {
+ longs.push_back(i);
+ shorts.push_back(i);
+ }
+ return 0; // Set breakpoint here to verify that std::vector 'longs' and 'shorts' have unique types.
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/unsigned_types/Makefile b/packages/Python/lldbsuite/test/lang/cpp/unsigned_types/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/unsigned_types/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/unsigned_types/TestUnsignedTypes.py b/packages/Python/lldbsuite/test/lang/cpp/unsigned_types/TestUnsignedTypes.py
new file mode 100644
index 000000000000..c137592558ed
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/unsigned_types/TestUnsignedTypes.py
@@ -0,0 +1,54 @@
+"""
+Test that variables with unsigned types display correctly.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import re
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class UnsignedTypesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.cpp', '// Set break point at this line.')
+
+ def test(self):
+ """Test that variables with unsigned types display correctly."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # GCC puts a breakpoint on the last line of a multi-line expression, so
+ # if GCC is the target compiler, we cannot rely on an exact line match.
+ need_exact = "gcc" not in self.getCompiler()
+ # Break on line 19 in main() aftre the variables are assigned values.
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line, num_expected_locations=-1, loc_exact=need_exact)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped', 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # Test that unsigned types display correctly.
+ self.expect("frame variable --show-types --no-args", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(unsigned char) the_unsigned_char = 'c'",
+ patterns = ["\((short unsigned int|unsigned short)\) the_unsigned_short = 99"],
+ substrs = ["(unsigned int) the_unsigned_int = 99",
+ "(unsigned long) the_unsigned_long = 99",
+ "(unsigned long long) the_unsigned_long_long = 99",
+ "(uint32_t) the_uint32 = 99"])
diff --git a/packages/Python/lldbsuite/test/lang/cpp/unsigned_types/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/unsigned_types/main.cpp
new file mode 100644
index 000000000000..b0d68377e983
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/unsigned_types/main.cpp
@@ -0,0 +1,22 @@
+//===-- main.cpp ------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+int main (int argc, char const *argv[])
+{
+ typedef unsigned int uint32_t;
+ unsigned char the_unsigned_char = 'c';
+ unsigned short the_unsigned_short = 'c';
+ unsigned int the_unsigned_int = 'c';
+ unsigned long the_unsigned_long = 'c';
+ unsigned long long the_unsigned_long_long = 'c';
+ uint32_t the_uint32 = 'c';
+
+ return the_unsigned_char - the_unsigned_short + // Set break point at this line.
+ the_unsigned_int - the_unsigned_long +
+ the_unsigned_long_long - the_uint32;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/virtual/Makefile b/packages/Python/lldbsuite/test/lang/cpp/virtual/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/virtual/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/virtual/TestVirtual.py b/packages/Python/lldbsuite/test/lang/cpp/virtual/TestVirtual.py
new file mode 100644
index 000000000000..1553a43e1a73
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/virtual/TestVirtual.py
@@ -0,0 +1,90 @@
+"""
+Test C++ virtual function and virtual inheritance.
+"""
+
+from __future__ import print_function
+
+import os, time
+import re
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+def Msg(expr, val):
+ return "'expression %s' matches the output (from compiled code): %s" % (expr, val)
+
+class CppVirtualMadness(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # This is the pattern by design to match the "my_expr = 'value'" output from
+ # printf() stmts (see main.cpp).
+ pattern = re.compile("^([^=]*) = '([^=]*)'$")
+
+ # Assert message.
+ PRINTF_OUTPUT_GROKKED = "The printf output from compiled code is parsed correctly"
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break for main.cpp.
+ self.source = 'main.cpp'
+ self.line = line_number(self.source, '// Set first breakpoint here.')
+
+ @expectedFailureIcc('llvm.org/pr16808') # lldb does not call the correct virtual function with icc
+ @expectedFailureAll(oslist=['windows'])
+ def test_virtual_madness(self):
+ """Test that expression works correctly with virtual inheritance as well as virtual function."""
+ self.build()
+
+ # Bring the program to the point where we can issue a series of
+ # 'expression' command to compare against the golden output.
+ self.dbg.SetAsync(False)
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget("a.out")
+ self.assertTrue(target, VALID_TARGET)
+
+ # Create the breakpoint inside function 'main'.
+ breakpoint = target.BreakpointCreateByLocation(self.source, self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ self.assertTrue(process.GetState() == lldb.eStateStopped)
+ thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+ self.assertTrue(thread.IsValid(), "There should be a thread stopped due to breakpoint condition")
+
+ # First, capture the golden output from the program itself from the
+ # series of printf statements.
+ stdout = process.GetSTDOUT(1024)
+
+ self.assertIsNotNone(stdout, "Encountered an error reading the process's output")
+
+ # This golden list contains a list of "my_expr = 'value' pairs extracted
+ # from the golden output.
+ gl = []
+
+ # Scan the golden output line by line, looking for the pattern:
+ #
+ # my_expr = 'value'
+ #
+ for line in stdout.split(os.linesep):
+ match = self.pattern.search(line)
+ if match:
+ my_expr, val = match.group(1), match.group(2)
+ gl.append((my_expr, val))
+ #print("golden list:", gl)
+
+ # Now iterate through the golden list, comparing against the output from
+ # 'expression var'.
+ for my_expr, val in gl:
+
+ self.runCmd("expression %s" % my_expr)
+ output = self.res.GetOutput()
+
+ # The expression output must match the oracle.
+ self.expect(output, Msg(my_expr, val), exe=False,
+ substrs = [val])
diff --git a/packages/Python/lldbsuite/test/lang/cpp/virtual/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/virtual/main.cpp
new file mode 100644
index 000000000000..bed1422dcbdd
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/virtual/main.cpp
@@ -0,0 +1,113 @@
+#include <stdio.h>
+#include <stdint.h>
+
+class A
+{
+public:
+ A () : m_pad ('c') {}
+
+ virtual ~A () {}
+
+ virtual const char * a()
+ {
+ return __PRETTY_FUNCTION__;
+ }
+
+ virtual const char * b()
+ {
+ return __PRETTY_FUNCTION__;
+ }
+
+ virtual const char * c()
+ {
+ return __PRETTY_FUNCTION__;
+ }
+protected:
+ char m_pad;
+};
+
+class AA
+{
+public:
+ AA () : m_pad('A') {}
+ virtual ~AA () {}
+
+ virtual const char * aa()
+ {
+ return __PRETTY_FUNCTION__;
+ }
+
+protected:
+ char m_pad;
+};
+
+class B : virtual public A, public AA
+{
+public:
+ B () : m_pad ('c') {}
+
+ virtual ~B () {}
+
+ virtual const char * a()
+ {
+ return __PRETTY_FUNCTION__;
+ }
+
+ virtual const char * b()
+ {
+ return __PRETTY_FUNCTION__;
+ }
+protected:
+ char m_pad;
+};
+
+class C : public B, virtual public A
+{
+public:
+ C () : m_pad ('c') {}
+
+ virtual ~C () {}
+
+ virtual const char * a()
+ {
+ return __PRETTY_FUNCTION__;
+ }
+protected:
+ char m_pad;
+};
+
+int main (int argc, char const *argv[], char const *envp[])
+{
+ A *a_as_A = new A();
+ B *b_as_B = new B();
+ A *b_as_A = b_as_B;
+ C *c_as_C = new C();
+ A *c_as_A = c_as_C;
+
+ printf ("a_as_A->a() = '%s'\n", a_as_A->a());
+ printf ("a_as_A->b() = '%s'\n", a_as_A->b());
+ printf ("a_as_A->c() = '%s'\n", a_as_A->c());
+ printf ("b_as_A->a() = '%s'\n", b_as_A->a());
+ printf ("b_as_A->b() = '%s'\n", b_as_A->b());
+ printf ("b_as_A->c() = '%s'\n", b_as_A->c());
+ printf ("b_as_B->aa() = '%s'\n", b_as_B->aa());
+ printf ("c_as_A->a() = '%s'\n", c_as_A->a());
+ printf ("c_as_A->b() = '%s'\n", c_as_A->b());
+ printf ("c_as_A->c() = '%s'\n", c_as_A->c());
+ printf ("c_as_C->aa() = '%s'\n", c_as_C->aa());
+ puts("");// Set first breakpoint here.
+ // then evaluate:
+ // expression a_as_A->a()
+ // expression a_as_A->b()
+ // expression a_as_A->c()
+ // expression b_as_A->a()
+ // expression b_as_A->b()
+ // expression b_as_A->c()
+ // expression b_as_B->aa()
+ // expression c_as_A->a()
+ // expression c_as_A->b()
+ // expression c_as_A->c()
+ // expression c_as_C->aa()
+
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/cpp/wchar_t/.categories b/packages/Python/lldbsuite/test/lang/cpp/wchar_t/.categories
new file mode 100644
index 000000000000..fe1da0247c62
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/wchar_t/.categories
@@ -0,0 +1 @@
+dataformatters
diff --git a/packages/Python/lldbsuite/test/lang/cpp/wchar_t/Makefile b/packages/Python/lldbsuite/test/lang/cpp/wchar_t/Makefile
new file mode 100644
index 000000000000..fe27980afe9b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/wchar_t/Makefile
@@ -0,0 +1,8 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+CFLAGS := -g -O0
+
+clean: OBJECTS+=$(wildcard main.d.*)
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/cpp/wchar_t/TestCxxWCharT.py b/packages/Python/lldbsuite/test/lang/cpp/wchar_t/TestCxxWCharT.py
new file mode 100644
index 000000000000..f9cdbca16e55
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/wchar_t/TestCxxWCharT.py
@@ -0,0 +1,74 @@
+#coding=utf8
+"""
+Test that C++ supports wchar_t correctly.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class CxxWCharTTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break for main.cpp.
+ self.source = 'main.cpp'
+ self.line = line_number(self.source, '// Set break point at this line.')
+
+ def test(self):
+ """Test that C++ supports wchar_t correctly."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Break on the struct declration statement in main.cpp.
+ lldbutil.run_break_set_by_file_and_line (self, "main.cpp", self.line)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ if not process:
+ self.fail("SBTarget.Launch() failed")
+
+ # Check that we correctly report templates on wchar_t
+ self.expect("frame variable foo_y",
+ substrs = ['(Foo<wchar_t>) foo_y = '])
+
+ # Check that we correctly report templates on int
+ self.expect("frame variable foo_x",
+ substrs = ['(Foo<int>) foo_x = '])
+
+ # Check that we correctly report wchar_t
+ self.expect("frame variable foo_y.object",
+ substrs = ['(wchar_t) foo_y.object = '])
+
+ # Check that we correctly report int
+ self.expect("frame variable foo_x.object",
+ substrs = ['(int) foo_x.object = '])
+
+ # Check that we can run expressions that return wchar_t
+ self.expect("expression L'a'",substrs = ['(wchar_t) $',"L'a'"])
+
+ # Mazel Tov if this works!
+ self.expect("frame variable mazeltov",
+ substrs = ['(const wchar_t *) mazeltov = ','L"מזל טוב"'])
+
+ self.expect("frame variable ws_NULL",substrs = ['(wchar_t *) ws_NULL = 0x0'])
+ self.expect("frame variable ws_empty",substrs = [' L""'])
+
+ self.expect("frame variable array",substrs = ['L"Hey, I\'m a super wchar_t string'])
+ self.expect("frame variable array",substrs = ['[0]'], matching=False)
+
+ self.expect('frame variable wchar_zero', substrs=["L'\\0'"])
+ self.expect('expression wchar_zero', substrs=["L'\\0'"])
diff --git a/packages/Python/lldbsuite/test/lang/cpp/wchar_t/main.cpp b/packages/Python/lldbsuite/test/lang/cpp/wchar_t/main.cpp
new file mode 100644
index 000000000000..e249c37b678f
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/cpp/wchar_t/main.cpp
@@ -0,0 +1,35 @@
+//===-- main.c --------------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <cstring>
+
+template <typename T>
+class Foo
+{
+public:
+ Foo () : object() {}
+ Foo (T x) : object(x) {}
+ T getObject() { return object; }
+private:
+ T object;
+};
+
+
+int main (int argc, char const *argv[])
+{
+ Foo<int> foo_x('a');
+ Foo<wchar_t> foo_y(L'a');
+ const wchar_t *mazeltov = L"מזל טוב";
+ wchar_t *ws_NULL = nullptr;
+ wchar_t *ws_empty = L"";
+ wchar_t array[200], * array_source = L"Hey, I'm a super wchar_t string, éõñž";
+ wchar_t wchar_zero = (wchar_t)0;
+ memcpy(array, array_source, 39 * sizeof(wchar_t));
+ return 0; // Set break point at this line.
+}
diff --git a/packages/Python/lldbsuite/test/lang/go/expressions/TestExpressions.py b/packages/Python/lldbsuite/test/lang/go/expressions/TestExpressions.py
new file mode 100644
index 000000000000..cbd244a7e056
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/go/expressions/TestExpressions.py
@@ -0,0 +1,113 @@
+"""Test the go expression parser/interpreter."""
+
+import os, time
+import unittest2
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestGoUserExpression(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @add_test_categories(['pyapi'])
+ @skipIfRemote # Not remote test suit ready
+ @skipUnlessGoInstalled
+ def test_with_dsym_and_python_api(self):
+ """Test GoASTUserExpress."""
+ self.buildGo()
+ self.launchProcess()
+ self.go_expressions()
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "main.go"
+ self.break_line = line_number(self.main_source, '// Set breakpoint here.')
+
+ def check_builtin(self, name, size=0, typeclass=lldb.eTypeClassBuiltin):
+ tl = self.target().FindTypes(name)
+ self.assertEqual(1, len(tl))
+ t = list(tl)[0]
+ self.assertEqual(name, t.name)
+ self.assertEqual(typeclass, t.type)
+ if size > 0:
+ self.assertEqual(size, t.size)
+
+ def launchProcess(self):
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ bpt = target.BreakpointCreateByLocation(self.main_source, self.break_line)
+ self.assertTrue(bpt, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, bpt)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ def go_expressions(self):
+ frame = self.frame()
+ v = frame.EvaluateExpression("1")
+ self.assertEqual(1, v.GetValueAsSigned())
+ x = frame.EvaluateExpression("x")
+ self.assertEqual(22, x.GetValueAsSigned())
+
+ a = frame.EvaluateExpression("a")
+ self.assertEqual(3, a.GetNumChildren())
+ a0 = a.GetChildAtIndex(0)
+ self.assertEqual(8, a0.GetValueAsSigned())
+
+ # Array indexing
+ a0 = frame.EvaluateExpression("a[0]")
+ self.assertEqual(8, a0.GetValueAsSigned())
+
+ # Slice indexing
+ b1 = frame.EvaluateExpression("b[1]")
+ self.assertEqual(9, b1.GetValueAsSigned())
+
+ # Test global in this package
+ g = frame.EvaluateExpression("myGlobal")
+ self.assertEqual(17, g.GetValueAsSigned(), str(g))
+
+ # Global with package name
+ g = frame.EvaluateExpression("main.myGlobal")
+ self.assertEqual(17, g.GetValueAsSigned(), str(g))
+
+ # Global with quoted package name
+ g = frame.EvaluateExpression('"main".myGlobal')
+ self.assertEqual(17, g.GetValueAsSigned(), str(g))
+
+ # Casting with package local type
+ s = frame.EvaluateExpression("*(*myStruct)(i.data)")
+ sb = s.GetChildMemberWithName("a")
+ self.assertEqual(2, sb.GetValueAsSigned())
+
+ # casting with explicit package
+ s = frame.EvaluateExpression("*(*main.myStruct)(i.data)")
+ sb = s.GetChildMemberWithName("a")
+ self.assertEqual(2, sb.GetValueAsSigned())
+
+ # Casting quoted package
+ s = frame.EvaluateExpression('*(*"main".myStruct)(i.data)')
+ sb = s.GetChildMemberWithName("b")
+ self.assertEqual(-1, sb.GetValueAsSigned())
+
+if __name__ == '__main__':
+ import atexit
+ lldb.SBDebugger.Initialize()
+ atexit.register(lambda: lldb.SBDebugger.Terminate())
+ unittest2.main()
diff --git a/packages/Python/lldbsuite/test/lang/go/expressions/main.go b/packages/Python/lldbsuite/test/lang/go/expressions/main.go
new file mode 100644
index 000000000000..c8b97fe07d7d
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/go/expressions/main.go
@@ -0,0 +1,21 @@
+package main
+
+import "fmt"
+
+type myStruct struct {
+ a, b int
+}
+
+var myGlobal = 17
+
+func myFunc(i interface{}) {
+ a := [...]int{8, 9, 10}
+ b := a[:]
+ x := 22
+ fmt.Println(a, b, x, i, myGlobal) // Set breakpoint here.
+}
+
+func main() {
+ s := myStruct {2, -1}
+ myFunc(s)
+} \ No newline at end of file
diff --git a/packages/Python/lldbsuite/test/lang/go/formatters/TestGoFormatters.py b/packages/Python/lldbsuite/test/lang/go/formatters/TestGoFormatters.py
new file mode 100644
index 000000000000..8b869df4ef8f
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/go/formatters/TestGoFormatters.py
@@ -0,0 +1,65 @@
+"""Test the Go Data Formatter Plugin."""
+
+import os, time
+import unittest2
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestGoLanguage(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipIfFreeBSD # llvm.org/pr24895 triggers assertion failure
+ @skipIfRemote # Not remote test suite ready
+ @no_debug_info_test
+ @skipUnlessGoInstalled
+ def test_go_formatter_plugin(self):
+ """Test go data formatters."""
+ self.buildGo()
+ self.launchProcess()
+ self.check_formatters()
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "main.go"
+ self.break_line = line_number(self.main_source, '// stop here')
+
+ def launchProcess(self):
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ self.bpt = target.BreakpointCreateByLocation(self.main_source, self.break_line)
+ self.assertTrue(self.bpt, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, self.bpt)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ def check_formatters(self):
+ a = self.frame().FindVariable('a')
+ self.assertEqual('(string) a = "my string"', str(a))
+ b = self.frame().FindVariable('b')
+ self.assertEqual("([]int) b = (len 2, cap 7) {\n [0] = 0\n [1] = 0\n}", str(b))
+
+
+if __name__ == '__main__':
+ import atexit
+ lldb.SBDebugger.Initialize()
+ atexit.register(lambda: lldb.SBDebugger.Terminate())
+ unittest2.main()
diff --git a/packages/Python/lldbsuite/test/lang/go/formatters/main.go b/packages/Python/lldbsuite/test/lang/go/formatters/main.go
new file mode 100644
index 000000000000..7956ad66bcb4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/go/formatters/main.go
@@ -0,0 +1,9 @@
+package main
+
+import "fmt"
+
+func main() {
+ a := "my string"
+ b := make([]int, 2, 7)
+ fmt.Println(a, b) // stop here
+} \ No newline at end of file
diff --git a/packages/Python/lldbsuite/test/lang/go/goroutines/TestGoroutines.py b/packages/Python/lldbsuite/test/lang/go/goroutines/TestGoroutines.py
new file mode 100644
index 000000000000..35961ebd1d92
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/go/goroutines/TestGoroutines.py
@@ -0,0 +1,85 @@
+"""Test the Go OS Plugin."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestGoASTContext(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @add_test_categories(['pyapi'])
+ @skipIfFreeBSD # llvm.org/pr24895 triggers assertion failure
+ @skipIfRemote # Not remote test suite ready
+ @no_debug_info_test
+ @skipUnlessGoInstalled
+ def test_goroutine_plugin(self):
+ """Test goroutine as threads support."""
+ self.buildGo()
+ self.launchProcess()
+ self.check_goroutines()
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "main.go"
+ self.break_line1 = line_number(self.main_source, '// stop1')
+ self.break_line2 = line_number(self.main_source, '// stop2')
+ self.break_line3 = line_number(self.main_source, '// stop3')
+
+ def launchProcess(self):
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ self.bpt1 = target.BreakpointCreateByLocation(self.main_source, self.break_line1)
+ self.assertTrue(self.bpt1, VALID_BREAKPOINT)
+ self.bpt2 = target.BreakpointCreateByLocation(self.main_source, self.break_line2)
+ self.assertTrue(self.bpt2, VALID_BREAKPOINT)
+ self.bpt3 = target.BreakpointCreateByLocation(self.main_source, self.break_line3)
+ self.assertTrue(self.bpt3, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, self.bpt1)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ def check_goroutines(self):
+ self.assertLess(len(self.process().threads), 20)
+ self.process().Continue()
+
+ # Make sure we stopped at the 2nd breakpoint
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (self.process(), self.bpt2)
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ # There's (at least) 21 goroutines.
+ self.assertGreater(len(self.process().threads), 20)
+ # self.dbg.HandleCommand("log enable lldb os")
+
+ # Now test that stepping works if the memory thread moves to a different backing thread.
+ for i in list(range(11)):
+ self.thread().StepOver()
+ self.assertEqual(lldb.eStopReasonPlanComplete, self.thread().GetStopReason(), self.thread().GetStopDescription(100))
+
+ # Disable the plugin and make sure the goroutines disappear
+ self.dbg.HandleCommand("settings set plugin.os.goroutines.enable false")
+ self.thread().StepInstruction(False)
+ self.assertLess(len(self.process().threads), 20)
diff --git a/packages/Python/lldbsuite/test/lang/go/goroutines/main.go b/packages/Python/lldbsuite/test/lang/go/goroutines/main.go
new file mode 100644
index 000000000000..bb44f7b8b716
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/go/goroutines/main.go
@@ -0,0 +1,89 @@
+package main
+
+import (
+ "fmt"
+ "runtime"
+)
+
+type philosopher struct {
+ i int
+ forks [2]chan bool
+ eating chan int
+ done chan struct{}
+}
+
+func (p philosopher) run() {
+ for {
+ select {
+ case <-p.done:
+ return
+ case <-p.forks[0]:
+ p.eat()
+ }
+ }
+}
+
+func (p philosopher) eat() {
+ select {
+ case <-p.done:
+ return
+ case <-p.forks[1]:
+ p.eating <- p.i
+ p.forks[0] <- true
+ p.forks[1] <- true
+ runtime.Gosched()
+ }
+}
+
+func startPhilosophers(n int) (chan struct{}, chan int) {
+ philosophers := make([]*philosopher, n)
+ chans := make([]chan bool, n)
+ for i := range chans {
+ chans[i] = make(chan bool, 1)
+ chans[i] <- true
+ }
+ eating := make(chan int, n)
+ done := make(chan struct{})
+ for i := range philosophers {
+ var min, max int
+ if i == n - 1 {
+ min = 0
+ max = i
+ } else {
+ min = i
+ max = i + 1
+ }
+ philosophers[i] = &philosopher{i: i, forks: [2]chan bool{chans[min], chans[max]}, eating: eating, done: done}
+ go philosophers[i].run()
+ }
+ return done, eating
+}
+
+func wait(c chan int) {
+ fmt.Println(<- c)
+ runtime.Gosched()
+}
+
+func main() {
+ // Restrict go to 1 real thread so we can be sure we're seeing goroutines
+ // and not threads.
+ runtime.GOMAXPROCS(1)
+ // Create a bunch of goroutines
+ done, eating := startPhilosophers(20) // stop1
+ // Now turn up the number of threads so this goroutine is likely to get
+ // scheduled on a different thread.
+ runtime.GOMAXPROCS(runtime.NumCPU()) // stop2
+ // Now let things run. Hopefully we'll bounce around
+ wait(eating)
+ wait(eating)
+ wait(eating)
+ wait(eating)
+ wait(eating)
+ wait(eating)
+ wait(eating)
+ wait(eating)
+ wait(eating)
+ wait(eating)
+ close(done)
+ fmt.Println("done") // stop3
+}
diff --git a/packages/Python/lldbsuite/test/lang/go/runtime/TestGoLanguageRuntime b/packages/Python/lldbsuite/test/lang/go/runtime/TestGoLanguageRuntime
new file mode 100644
index 000000000000..44797077a641
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/go/runtime/TestGoLanguageRuntime
@@ -0,0 +1,80 @@
+"""Test the go dynamic type handling."""
+
+import os, time
+import unittest2
+import lldb
+import lldbutil
+from lldbtest import *
+
+class TestGoLanguageRuntime(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @python_api_test
+ @expectedFailureFreeBSD('llvm.org/pr24895')
+ @skipIfRemote # Not remote test suite ready
+ @skipUnlessGoInstalled
+ def test_with_dsym_and_python_api(self):
+ """Test GoASTContext dwarf parsing."""
+ self.buildGo()
+ self.launchProcess()
+ self.go_interface_types()
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "main.go"
+ self.break_line1 = line_number(self.main_source, '// Set breakpoint 1')
+ self.break_line2 = line_number(self.main_source, '// Set breakpoint 2')
+
+
+ def launchProcess(self):
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ bpt1 = target.BreakpointCreateByLocation(self.main_source, self.break_line1)
+ self.assertTrue(bpt1, VALID_BREAKPOINT)
+ bpt2 = target.BreakpointCreateByLocation(self.main_source, self.break_line2)
+ self.assertTrue(bpt2, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, bpt1)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ def go_interface_types(self):
+ f = self.frame()
+ v = f.FindVariable("a", lldb.eDynamicCanRunTarget)
+ self.assertEqual("*int", v.GetType().name)
+ self.assertEqual(1, v.Dereference().GetValueAsSigned())
+ v = f.FindVariable("b", lldb.eDynamicCanRunTarget)
+ self.assertEqual("*float64", v.GetType().name)
+ err = lldb.SBError()
+ self.assertEqual(2.0, v.Dereference().GetData().GetDouble(err, 0))
+ v = f.FindVariable("c", lldb.eDynamicCanRunTarget)
+ self.assertEqual("*main.SomeFooer", v.GetType().name)
+ self.assertEqual(9, v.Dereference().GetChildAtIndex(0).GetValueAsSigned())
+ v = f.FindVariable("d", lldb.eDynamicCanRunTarget)
+ self.assertEqual("*main.AnotherFooer", v.GetType().name)
+ self.assertEqual(-1, v.Dereference().GetChildAtIndex(0).GetValueAsSigned())
+ self.assertEqual(-2, v.Dereference().GetChildAtIndex(1).GetValueAsSigned())
+ self.assertEqual(-3, v.Dereference().GetChildAtIndex(2).GetValueAsSigned())
+
+if __name__ == '__main__':
+ import atexit
+ lldb.SBDebugger.Initialize()
+ atexit.register(lambda: lldb.SBDebugger.Terminate())
+ unittest2.main()
diff --git a/packages/Python/lldbsuite/test/lang/go/runtime/main.go b/packages/Python/lldbsuite/test/lang/go/runtime/main.go
new file mode 100644
index 000000000000..227c8c377ed7
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/go/runtime/main.go
@@ -0,0 +1,38 @@
+package main
+
+import "fmt"
+
+type Fooer interface {
+ Foo() int
+}
+
+type SomeFooer struct {
+ val int
+}
+
+func (s SomeFooer) Foo() int {
+ return s.val
+}
+
+type AnotherFooer struct {
+ a, b, c int
+}
+
+func (s AnotherFooer) Foo() int {
+ return s.a
+}
+
+
+func printEface(a, b, c, d interface{}) {
+ fmt.Println(a, b, c, d) // Set breakpoint 1
+}
+
+func printIface(a, b Fooer) {
+ fmt.Println(a, b) // Set breakpoint 2
+}
+func main() {
+ sf := SomeFooer{9}
+ af := AnotherFooer{-1, -2, -3}
+ printEface(1,2.0, sf, af)
+ printIface(sf, af)
+} \ No newline at end of file
diff --git a/packages/Python/lldbsuite/test/lang/go/types/TestGoASTContext.py b/packages/Python/lldbsuite/test/lang/go/types/TestGoASTContext.py
new file mode 100644
index 000000000000..8da31e9e81f7
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/go/types/TestGoASTContext.py
@@ -0,0 +1,133 @@
+"""Test the go DWARF type parsing."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestGoASTContext(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @add_test_categories(['pyapi'])
+ @skipIfFreeBSD # llvm.org/pr24895 triggers assertion failure
+ @skipIfRemote # Not remote test suit ready
+ @no_debug_info_test
+ @skipUnlessGoInstalled
+ def test_with_dsym_and_python_api(self):
+ """Test GoASTContext dwarf parsing."""
+ self.buildGo()
+ self.launchProcess()
+ self.go_builtin_types()
+ self.check_main_vars()
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "main.go"
+ self.break_line = line_number(self.main_source, '// Set breakpoint here.')
+
+ def check_builtin(self, name, size=0, typeclass=lldb.eTypeClassBuiltin):
+ tl = self.target().FindTypes(name)
+ self.assertEqual(1, len(tl))
+ t = list(tl)[0]
+ self.assertEqual(name, t.name)
+ self.assertEqual(typeclass, t.type)
+ if size > 0:
+ self.assertEqual(size, t.size)
+
+ def launchProcess(self):
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ bpt = target.BreakpointCreateByLocation(self.main_source, self.break_line)
+ self.assertTrue(bpt, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, bpt)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ def go_builtin_types(self):
+ address_size = self.target().GetAddressByteSize()
+ self.check_builtin('bool')
+ self.check_builtin('uint8', 1)
+ self.check_builtin('int8', 1)
+ self.check_builtin('uint16', 2)
+ self.check_builtin('int16', 2)
+ self.check_builtin('uint32', 4)
+ self.check_builtin('int32', 4)
+ self.check_builtin('uint64', 8)
+ self.check_builtin('int64', 8)
+ self.check_builtin('uintptr', address_size)
+ self.check_builtin('int', address_size)
+ self.check_builtin('uint', address_size)
+ self.check_builtin('float32', 4)
+ self.check_builtin('float64', 8)
+ self.check_builtin('complex64', 8, lldb.eTypeClassComplexFloat)
+ self.check_builtin('complex128', 16, lldb.eTypeClassComplexFloat)
+
+ def var(self, name):
+ var = self.frame().FindVariable(name)
+ self.assertTrue(var.IsValid(), "%s %s" % (VALID_VARIABLE, name))
+ return var
+
+ def check_main_vars(self):
+ v = self.var('theBool')
+ self.assertEqual('true', v.value)
+
+ v = self.var('theInt')
+ self.assertEqual('-7', v.value)
+
+ v = self.var('theComplex')
+ self.assertEqual('1 + 2i', v.value)
+
+ v = self.var('thePointer')
+ self.assertTrue(v.TypeIsPointerType())
+ self.assertEqual('-10', v.Dereference().value)
+ self.assertEqual(1, v.GetNumChildren())
+ self.assertEqual('-10', v.GetChildAtIndex(0).value)
+
+ # print()
+ # print(os.getpid())
+ # time.sleep(60)
+ v = self.var('theStruct')
+ if v.TypeIsPointerType():
+ v = v.Dereference()
+ self.assertEqual(2, v.GetNumChildren())
+ self.assertEqual('7', v.GetChildAtIndex(0).value)
+ self.assertEqual('7', v.GetChildMemberWithName('myInt').value)
+ self.assertEqual(v.load_addr, v.GetChildAtIndex(1).GetValueAsUnsigned())
+ self.assertEqual(v.load_addr, v.GetChildMemberWithName('myPointer').GetValueAsUnsigned())
+
+ # Test accessing struct fields through pointers.
+ v = v.GetChildMemberWithName('myPointer')
+ self.assertTrue(v.TypeIsPointerType())
+ self.assertEqual(2, v.GetNumChildren())
+ self.assertEqual('7', v.GetChildAtIndex(0).value)
+ c = v.GetChildMemberWithName('myPointer')
+ self.assertTrue(c.TypeIsPointerType())
+ self.assertEqual(2, c.GetNumChildren())
+ self.assertEqual('7', c.GetChildAtIndex(0).value)
+
+ v = self.var('theArray')
+ self.assertEqual(5, v.GetNumChildren())
+ for i in list(range(5)):
+ self.assertEqual(str(i + 1), v.GetChildAtIndex(i).value)
diff --git a/packages/Python/lldbsuite/test/lang/go/types/main.go b/packages/Python/lldbsuite/test/lang/go/types/main.go
new file mode 100644
index 000000000000..c74650721d7d
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/go/types/main.go
@@ -0,0 +1,47 @@
+package main
+
+import "fmt"
+
+type Fooer interface {
+ Foo() int
+}
+
+type SomeFooer struct {
+ val int
+}
+
+func (s SomeFooer) Foo() int {
+ return s.val
+}
+
+type mystruct struct {
+ myInt int
+ myPointer *mystruct
+}
+
+func main() {
+ theBool := true
+ theInt := -7
+ theComplex := 1 + 2i
+ pointee := -10
+ thePointer := &pointee
+ theStruct := &mystruct { myInt: 7}
+ theStruct.myPointer = theStruct
+ theArray := [5]byte{1, 2, 3, 4, 5}
+ theSlice := theArray[1:2]
+ theString := "abc"
+
+ f := SomeFooer {9}
+ var theEface interface{} = f
+ var theFooer Fooer = f
+
+ theChan := make(chan int)
+ theMap := make(map[int]string)
+ theMap[1] = "1"
+
+ fmt.Println(theBool) // Set breakpoint here.
+ // Reference all the variables so the compiler is happy.
+ fmt.Println(theInt, theComplex, thePointer, theStruct.myInt)
+ fmt.Println(theArray[0], theSlice[0], theString)
+ fmt.Println(theEface, theFooer, theChan, theMap)
+} \ No newline at end of file
diff --git a/packages/Python/lldbsuite/test/lang/mixed/Makefile b/packages/Python/lldbsuite/test/lang/mixed/Makefile
new file mode 100644
index 000000000000..860343ee907c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/mixed/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../make
+
+CXX_SOURCES := foo.cpp
+C_SOURCES := main.c
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/mixed/TestMixedLanguages.py b/packages/Python/lldbsuite/test/lang/mixed/TestMixedLanguages.py
new file mode 100644
index 000000000000..d11f03b878ae
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/mixed/TestMixedLanguages.py
@@ -0,0 +1,56 @@
+"""Test that lldb works correctly on compile units form different languages."""
+
+from __future__ import print_function
+
+
+
+import os, time, re
+import lldb
+from lldbsuite.test.lldbtest import *
+
+class MixedLanguagesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_language_of_frame(self):
+ """Test that the language defaults to the language of the current frame."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Execute the cleanup function during test case tear down
+ # to restore the frame format.
+ def cleanup():
+ self.runCmd("settings set frame-format %s" % self.format_string, check=False)
+ self.addTearDownHook(cleanup)
+ self.runCmd("settings show frame-format")
+ m = re.match(
+ '^frame-format \(format-string\) = "(.*)\"$',
+ self.res.GetOutput())
+ self.assertTrue(m, "Bad settings string")
+ self.format_string = m.group(1)
+
+ # Change the default format to print the language.
+ format_string = "frame #${frame.index}: ${frame.pc}{ ${module.file.basename}`${function.name}{${function.pc-offset}}}{, lang=${language}}\n"
+ self.runCmd("settings set frame-format %s" % format_string)
+ self.expect("settings show frame-format", SETTING_MSG("frame-format"),
+ substrs = [format_string])
+
+ # Run to BP at main (in main.c) and test that the language is C.
+ self.runCmd("breakpoint set -n main")
+ self.runCmd("run")
+ self.expect("thread backtrace",
+ substrs = ["`main", "lang=c"])
+ # Make sure evaluation of C++11 fails.
+ self.expect("expr foo != nullptr", error=True,
+ startstr = "error")
+
+ # Run to BP at foo (in foo.cpp) and test that the language is C++.
+ self.runCmd("breakpoint set -n foo")
+ self.runCmd("continue")
+ self.expect("thread backtrace",
+ substrs = ["`::foo()", "lang=c++"])
+ # Make sure we can evaluate an expression requiring C++11
+ # (note: C++11 is enabled by default for C++).
+ self.expect("expr foo != nullptr",
+ patterns = ["true"])
diff --git a/packages/Python/lldbsuite/test/lang/mixed/foo.cpp b/packages/Python/lldbsuite/test/lang/mixed/foo.cpp
new file mode 100644
index 000000000000..8a5a6a2b5416
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/mixed/foo.cpp
@@ -0,0 +1,11 @@
+namespace ns {
+ int func(void)
+ {
+ return 0;
+ }
+}
+
+extern "C" int foo(void)
+{
+ return ns::func();
+}
diff --git a/packages/Python/lldbsuite/test/lang/mixed/main.c b/packages/Python/lldbsuite/test/lang/mixed/main.c
new file mode 100644
index 000000000000..f5c5d19f2c89
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/mixed/main.c
@@ -0,0 +1,15 @@
+int foo(void);
+static int static_value = 0;
+
+int
+bar()
+{
+ static_value++;
+ return static_value;
+}
+
+int main (int argc, char const *argv[])
+{
+ bar(); // breakpoint_in_main
+ return foo();
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/.categories b/packages/Python/lldbsuite/test/lang/objc/.categories
new file mode 100644
index 000000000000..72cf07c1efea
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/.categories
@@ -0,0 +1 @@
+objc
diff --git a/packages/Python/lldbsuite/test/lang/objc/blocks/Makefile b/packages/Python/lldbsuite/test/lang/objc/blocks/Makefile
new file mode 100644
index 000000000000..0af83591826f
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/blocks/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := ivars-in-blocks.m main.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/blocks/TestObjCIvarsInBlocks.py b/packages/Python/lldbsuite/test/lang/objc/blocks/TestObjCIvarsInBlocks.py
new file mode 100644
index 000000000000..6a1cde1a3cb3
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/blocks/TestObjCIvarsInBlocks.py
@@ -0,0 +1,103 @@
+"""Test printing ivars and ObjC objects captured in blocks that are made in methods of an ObjC class."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TestObjCIvarsInBlocks(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "main.m"
+ self.class_source = "ivars-in-blocks.m"
+ self.class_source_file_spec = lldb.SBFileSpec(self.class_source)
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ @expectedFailurei386 # This test requires the 2.0 runtime, so it will fail on i386.
+ def test_with_python_api(self):
+ """Test printing the ivars of the self when captured in blocks"""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ breakpoint = target.BreakpointCreateBySourceRegex ('// Break here inside the block.', self.class_source_file_spec)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ breakpoint_two = target.BreakpointCreateBySourceRegex ('// Break here inside the class method block.', self.class_source_file_spec)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue (process, "Created a process.")
+ self.assertTrue (process.GetState() == lldb.eStateStopped, "Stopped it too.")
+
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, breakpoint)
+ self.assertTrue (len(thread_list) == 1)
+ thread = thread_list[0]
+
+ frame = thread.GetFrameAtIndex(0)
+ self.assertTrue (frame, "frame 0 is valid")
+
+ # First use the FindVariable API to see if we can find the ivar by undecorated name:
+ direct_blocky = frame.GetValueForVariablePath ("blocky_ivar")
+ self.assertTrue(direct_blocky, "Found direct access to blocky_ivar.")
+
+ # Now get it as a member of "self" and make sure the two values are equal:
+ self_var = frame.GetValueForVariablePath ("self")
+ self.assertTrue (self_var, "Found self in block.")
+ indirect_blocky = self_var.GetChildMemberWithName ("blocky_ivar")
+ self.assertTrue (indirect_blocky, "Found blocky_ivar through self")
+
+ error = lldb.SBError()
+ direct_value = direct_blocky.GetValueAsSigned(error)
+ self.assertTrue (error.Success(), "Got direct value for blocky_ivar")
+
+ indirect_value = indirect_blocky.GetValueAsSigned (error)
+ self.assertTrue (error.Success(), "Got indirect value for blocky_ivar")
+
+ self.assertTrue (direct_value == indirect_value, "Direct and indirect values are equal.")
+
+ # Now make sure that we can get at the captured ivar through the expression parser.
+ # Doing a little trivial math will force this into the real expression parser:
+ direct_expr = frame.EvaluateExpression ("blocky_ivar + 10")
+ self.assertTrue (direct_expr, "Got blocky_ivar through the expression parser")
+
+ # Again, get the value through self directly and make sure they are the same:
+ indirect_expr = frame.EvaluateExpression ("self->blocky_ivar + 10")
+ self.assertTrue (indirect_expr, "Got blocky ivar through expression parser using self.")
+
+ direct_value = direct_expr.GetValueAsSigned (error)
+ self.assertTrue (error.Success(), "Got value from direct use of expression parser")
+
+ indirect_value = indirect_expr.GetValueAsSigned (error)
+ self.assertTrue (error.Success(), "Got value from indirect access using the expression parser")
+
+ self.assertTrue (direct_value == indirect_value, "Direct ivar access and indirect through expression parser produce same value.")
+
+ process.Continue()
+ self.assertTrue (process.GetState() == lldb.eStateStopped, "Stopped at the second breakpoint.")
+
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, breakpoint_two)
+ self.assertTrue (len(thread_list) == 1)
+ thread = thread_list[0]
+
+ frame = thread.GetFrameAtIndex(0)
+ self.assertTrue (frame, "frame 0 is valid")
+
+ expr = frame.EvaluateExpression("(ret)")
+ self.assertTrue (expr, "Successfully got a local variable in a block in a class method.")
+
+ ret_value_signed = expr.GetValueAsSigned (error)
+ # print('ret_value_signed = %i' % (ret_value_signed))
+ self.assertTrue (ret_value_signed == 5, "The local variable in the block was what we expected.")
diff --git a/packages/Python/lldbsuite/test/lang/objc/blocks/ivars-in-blocks.h b/packages/Python/lldbsuite/test/lang/objc/blocks/ivars-in-blocks.h
new file mode 100644
index 000000000000..1ceac3361ac0
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/blocks/ivars-in-blocks.h
@@ -0,0 +1,11 @@
+#import <Foundation/Foundation.h>
+
+@interface IAmBlocky : NSObject
+{
+ @public
+ int blocky_ivar;
+}
++ (void) classMethod;
+- (IAmBlocky *) init;
+- (int) callABlock: (int) block_value;
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/blocks/ivars-in-blocks.m b/packages/Python/lldbsuite/test/lang/objc/blocks/ivars-in-blocks.m
new file mode 100644
index 000000000000..1098a9136ae2
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/blocks/ivars-in-blocks.m
@@ -0,0 +1,57 @@
+#import "ivars-in-blocks.h"
+
+typedef int (^my_block_ptr_type) (int);
+
+@interface IAmBlocky()
+{
+ int _hidden_ivar;
+ my_block_ptr_type _block_ptr;
+}
+
+@end
+
+@implementation IAmBlocky
+
++ (int) addend
+{
+ return 3;
+}
+
++ (void) classMethod
+{
+ int (^my_block)(int) = ^(int foo)
+ {
+ int ret = foo + [self addend];
+ return ret; // Break here inside the class method block.
+ };
+ printf("%d\n", my_block(2));
+}
+
+- (void) makeBlockPtr;
+{
+ _block_ptr = ^(int inval)
+ {
+ _hidden_ivar += inval;
+ return blocky_ivar * inval; // Break here inside the block.
+ };
+}
+
+- (IAmBlocky *) init
+{
+ blocky_ivar = 10;
+ _hidden_ivar = 20;
+ // Interesting... Apparently you can't make a block in your init method. This crashes...
+ // [self makeBlockPtr];
+ return self;
+}
+
+- (int) callABlock: (int) block_value
+{
+ if (_block_ptr == NULL)
+ [self makeBlockPtr];
+ int ret = _block_ptr (block_value);
+ [IAmBlocky classMethod];
+ return ret;
+}
+@end
+
diff --git a/packages/Python/lldbsuite/test/lang/objc/blocks/main.m b/packages/Python/lldbsuite/test/lang/objc/blocks/main.m
new file mode 100644
index 000000000000..0c56f45da464
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/blocks/main.m
@@ -0,0 +1,10 @@
+#import "ivars-in-blocks.h"
+
+int
+main (int argc, char **argv)
+{
+ IAmBlocky *my_blocky = [[IAmBlocky alloc] init];
+ int blocky_value;
+ blocky_value = [my_blocky callABlock: 33];
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/forward-decl/Container.h b/packages/Python/lldbsuite/test/lang/objc/forward-decl/Container.h
new file mode 100644
index 000000000000..85bbd06b161c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/forward-decl/Container.h
@@ -0,0 +1,13 @@
+#import <Foundation/Foundation.h>
+
+@class ForwardDeclaredClass;
+
+@interface Container : NSObject {
+@public
+ ForwardDeclaredClass *member;
+}
+
+-(id)init;
+-(ForwardDeclaredClass*)getMember;
+
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/forward-decl/Container.m b/packages/Python/lldbsuite/test/lang/objc/forward-decl/Container.m
new file mode 100644
index 000000000000..4d2139ff5fc6
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/forward-decl/Container.m
@@ -0,0 +1,27 @@
+#import "Container.h"
+
+@interface ForwardDeclaredClass : NSObject
+{
+ int a;
+ int b;
+}
+@end
+
+@implementation ForwardDeclaredClass
+
+@end
+
+@implementation Container
+
+-(id)init
+{
+ member = [ForwardDeclaredClass alloc];
+ return [super init];
+}
+
+-(ForwardDeclaredClass *)getMember
+{
+ return member;
+}
+
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/forward-decl/Makefile b/packages/Python/lldbsuite/test/lang/objc/forward-decl/Makefile
new file mode 100644
index 000000000000..b99925b50b38
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/forward-decl/Makefile
@@ -0,0 +1,9 @@
+LEVEL = ../../../make
+
+DYLIB_NAME := Container
+DYLIB_OBJC_SOURCES := Container.m
+OBJC_SOURCES := main.m
+
+include $(LEVEL)/Makefile.rules
+
+LDFLAGS += -framework Foundation
diff --git a/packages/Python/lldbsuite/test/lang/objc/forward-decl/TestForwardDecl.py b/packages/Python/lldbsuite/test/lang/objc/forward-decl/TestForwardDecl.py
new file mode 100644
index 000000000000..207518abc91b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/forward-decl/TestForwardDecl.py
@@ -0,0 +1,54 @@
+"""Test that a forward-declared class works when its complete definition is in a library"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class ForwardDeclTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.source = 'main.m'
+ self.line = line_number(self.source, '// Set breakpoint 0 here.')
+ self.shlib_names = ["Container"]
+
+ @skipUnlessDarwin
+ def test_expr(self):
+ self.build()
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget("a.out")
+ self.assertTrue(target, VALID_TARGET)
+
+ # Create the breakpoint inside function 'main'.
+ breakpoint = target.BreakpointCreateByLocation(self.source, self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ # Register our shared libraries for remote targets so they get automatically uploaded
+ environment = self.registerSharedLibrariesWithTarget(target, self.shlib_names)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, environment, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # This should display correctly.
+ self.expect("expression [j getMember]", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 0x"])
diff --git a/packages/Python/lldbsuite/test/lang/objc/forward-decl/main.m b/packages/Python/lldbsuite/test/lang/objc/forward-decl/main.m
new file mode 100644
index 000000000000..8e5256e95230
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/forward-decl/main.m
@@ -0,0 +1,14 @@
+#import <Foundation/Foundation.h>
+#import "Container.h"
+
+int main(int argc, const char * argv[])
+{
+
+ @autoreleasepool {
+ Container *j = [[Container alloc] init];
+
+ printf("member value = %p", [j getMember]); // Set breakpoint 0 here.
+ }
+ return 0;
+}
+
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/Makefile b/packages/Python/lldbsuite/test/lang/objc/foundation/Makefile
new file mode 100644
index 000000000000..ce2ccd28321d
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/Makefile
@@ -0,0 +1,8 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m my-base.m
+#OBJC_SOURCES := const-strings.m
+
+include $(LEVEL)/Makefile.rules
+
+LDFLAGS += -framework Foundation
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/TestConstStrings.py b/packages/Python/lldbsuite/test/lang/objc/foundation/TestConstStrings.py
new file mode 100644
index 000000000000..a9298dd81cf8
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/TestConstStrings.py
@@ -0,0 +1,53 @@
+"""
+Test that objective-c constant strings are generated correctly by the expression
+parser.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class ConstStringTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+ d = {'OBJC_SOURCES': 'const-strings.m'}
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.main_source = "const-strings.m"
+ self.line = line_number(self.main_source, '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ def test_break(self):
+ """Test constant string generation amd comparison by the expression parser."""
+ self.build(dictionary=self.d)
+ self.setTearDownCleanup(self.d)
+
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, self.main_source, self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+ self.expect("process status", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = [" at %s:%d" % (self.main_source, self.line),
+ "stop reason = breakpoint"])
+
+ self.expect('expression (int)[str compare:@"hello"]',
+ startstr = "(int) $0 = 0")
+ self.expect('expression (int)[str compare:@"world"]',
+ startstr = "(int) $1 = -1")
+
+ # Test empty strings, too.
+ self.expect('expression (int)[@"" length]',
+ startstr = "(int) $2 = 0")
+
+ self.expect('expression (int)[@"123" length]',
+ startstr = "(int) $3 = 3")
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/TestFoundationDisassembly.py b/packages/Python/lldbsuite/test/lang/objc/foundation/TestFoundationDisassembly.py
new file mode 100644
index 000000000000..88db12e95931
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/TestFoundationDisassembly.py
@@ -0,0 +1,134 @@
+"""
+Test the lldb disassemble command on foundation framework.
+"""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+@skipUnlessDarwin
+class FoundationDisassembleTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ # rdar://problem/8504895
+ # Crash while doing 'disassemble -n "-[NSNumber descriptionWithLocale:]"
+ @unittest2.skipIf(TestBase.skipLongRunningTest(), "Skip this long running test")
+ def test_foundation_disasm(self):
+ """Do 'disassemble -n func' on each and every 'Code' symbol entry from the Foundation.framework."""
+ self.build()
+
+ # Enable synchronous mode
+ self.dbg.SetAsync(False)
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget("a.out")
+ self.assertTrue(target, VALID_TARGET)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ foundation_framework = None
+ for module in target.modules:
+ print(module)
+ if module.file.basename == "Foundation":
+ foundation_framework = module.file.fullpath
+ break
+
+ self.assertTrue(foundation_framework != None, "Foundation.framework path located")
+ self.runCmd("image dump symtab '%s'" % foundation_framework)
+ raw_output = self.res.GetOutput()
+ # Now, grab every 'Code' symbol and feed it into the command:
+ # 'disassemble -n func'.
+ #
+ # The symbol name is on the last column and trails the flag column which
+ # looks like '0xhhhhhhhh', i.e., 8 hexadecimal digits.
+ codeRE = re.compile(r"""
+ \ Code\ {9} # ' Code' followed by 9 SPCs,
+ .* # the wildcard chars,
+ 0x[0-9a-f]{8} # the flag column, and
+ \ (.+)$ # finally the function symbol.
+ """, re.VERBOSE)
+ for line in raw_output.split(os.linesep):
+ match = codeRE.search(line)
+ if match:
+ func = match.group(1)
+ #print("line:", line)
+ #print("func:", func)
+ self.runCmd('disassemble -n "%s"' % func)
+
+
+ def test_simple_disasm(self):
+ """Test the lldb 'disassemble' command"""
+ self.build()
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget("a.out")
+ self.assertTrue(target, VALID_TARGET)
+
+ print(target)
+ for module in target.modules:
+ print(module)
+
+ # Stop at +[NSString stringWithFormat:].
+ symbol_name = "+[NSString stringWithFormat:]"
+ break_results = lldbutil.run_break_set_command (self, "_regexp-break %s"%(symbol_name))
+
+ lldbutil.check_breakpoint_result (self, break_results, symbol_name=symbol_name, num_locations=1)
+
+ # Stop at -[MyString initWithNSString:].
+ lldbutil.run_break_set_by_symbol (self, '-[MyString initWithNSString:]', num_expected_locations=1, sym_exact=True)
+
+ # Stop at the "description" selector.
+ lldbutil.run_break_set_by_selector (self, 'description', num_expected_locations=1, module_name='a.out')
+
+ # Stop at -[NSAutoreleasePool release].
+ break_results = lldbutil.run_break_set_command (self, "_regexp-break -[NSAutoreleasePool release]")
+ lldbutil.check_breakpoint_result (self, break_results, symbol_name='-[NSAutoreleasePool release]', num_locations=1)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # First stop is +[NSString stringWithFormat:].
+ self.expect("thread backtrace", "Stop at +[NSString stringWithFormat:]",
+ substrs = ["Foundation`+[NSString stringWithFormat:]"])
+
+ # Do the disassemble for the currently stopped function.
+ self.runCmd("disassemble -f")
+
+ self.runCmd("process continue")
+ # Skip another breakpoint for +[NSString stringWithFormat:].
+ self.runCmd("process continue")
+
+ # Followed by a.out`-[MyString initWithNSString:].
+ self.expect("thread backtrace", "Stop at a.out`-[MyString initWithNSString:]",
+ substrs = ["a.out`-[MyString initWithNSString:]"])
+
+ # Do the disassemble for the currently stopped function.
+ self.runCmd("disassemble -f")
+
+ self.runCmd("process continue")
+
+ # Followed by -[MyString description].
+ self.expect("thread backtrace", "Stop at -[MyString description]",
+ substrs = ["a.out`-[MyString description]"])
+
+ # Do the disassemble for the currently stopped function.
+ self.runCmd("disassemble -f")
+
+ self.runCmd("process continue")
+ # Skip another breakpoint for -[MyString description].
+ self.runCmd("process continue")
+
+ # Followed by -[NSAutoreleasePool release].
+ self.expect("thread backtrace", "Stop at -[NSAutoreleasePool release]",
+ substrs = ["Foundation`-[NSAutoreleasePool release]"])
+
+ # Do the disassemble for the currently stopped function.
+ self.runCmd("disassemble -f")
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods.py b/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods.py
new file mode 100644
index 000000000000..8358bd5e923f
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods.py
@@ -0,0 +1,262 @@
+"""
+Set breakpoints on objective-c class and instance methods in foundation.
+Also lookup objective-c data types and evaluate expressions.
+"""
+
+from __future__ import print_function
+
+
+
+import os, os.path, time
+import lldb
+import string
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+file_index = 0
+@skipUnlessDarwin
+class FoundationTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.main_source = "main.m"
+ self.line = line_number(self.main_source, '// Set break point at this line.')
+
+ def test_break(self):
+ """Test setting objc breakpoints using '_regexp-break' and 'breakpoint set'."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Stop at +[NSString stringWithFormat:].
+ break_results = lldbutil.run_break_set_command(self, "_regexp-break +[NSString stringWithFormat:]")
+ lldbutil.check_breakpoint_result (self, break_results, symbol_name='+[NSString stringWithFormat:]', num_locations=1)
+
+ # Stop at -[MyString initWithNSString:].
+ lldbutil.run_break_set_by_symbol (self, '-[MyString initWithNSString:]', num_expected_locations=1, sym_exact=True)
+
+ # Stop at the "description" selector.
+ lldbutil.run_break_set_by_selector (self, 'description', num_expected_locations=1, module_name='a.out')
+
+ # Stop at -[NSAutoreleasePool release].
+ break_results = lldbutil.run_break_set_command(self, "_regexp-break -[NSAutoreleasePool release]")
+ lldbutil.check_breakpoint_result (self, break_results, symbol_name='-[NSAutoreleasePool release]', num_locations=1)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # First stop is +[NSString stringWithFormat:].
+ self.expect("thread backtrace", "Stop at +[NSString stringWithFormat:]",
+ substrs = ["Foundation`+[NSString stringWithFormat:]"])
+
+ self.runCmd("process continue")
+
+ # Second stop is still +[NSString stringWithFormat:].
+ self.expect("thread backtrace", "Stop at +[NSString stringWithFormat:]",
+ substrs = ["Foundation`+[NSString stringWithFormat:]"])
+
+ self.runCmd("process continue")
+
+ # Followed by a.out`-[MyString initWithNSString:].
+ self.expect("thread backtrace", "Stop at a.out`-[MyString initWithNSString:]",
+ substrs = ["a.out`-[MyString initWithNSString:]"])
+
+ self.runCmd("process continue")
+
+ # Followed by -[MyString description].
+ self.expect("thread backtrace", "Stop at -[MyString description]",
+ substrs = ["a.out`-[MyString description]"])
+
+ self.runCmd("process continue")
+
+ # Followed by the same -[MyString description].
+ self.expect("thread backtrace", "Stop at -[MyString description]",
+ substrs = ["a.out`-[MyString description]"])
+
+ self.runCmd("process continue")
+
+ # Followed by -[NSAutoreleasePool release].
+ self.expect("thread backtrace", "Stop at -[NSAutoreleasePool release]",
+ substrs = ["Foundation`-[NSAutoreleasePool release]"])
+
+ # rdar://problem/8542091
+ # rdar://problem/8492646
+ def test_data_type_and_expr(self):
+ """Lookup objective-c data types and evaluate expressions."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Stop at -[MyString description].
+ lldbutil.run_break_set_by_symbol (self, '-[MyString description]', num_expected_locations=1, sym_exact=True)
+# self.expect("breakpoint set -n '-[MyString description]", BREAKPOINT_CREATED,
+# startstr = "Breakpoint created: 1: name = '-[MyString description]', locations = 1")
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The backtrace should show we stop at -[MyString description].
+ self.expect("thread backtrace", "Stop at -[MyString description]",
+ substrs = ["a.out`-[MyString description]"])
+
+ # Lookup objc data type MyString and evaluate some expressions.
+
+ self.expect("image lookup -t NSString", DATA_TYPES_DISPLAYED_CORRECTLY,
+ substrs = ['name = "NSString"',
+ 'compiler_type = "@interface NSString'])
+
+ self.expect("image lookup -t MyString", DATA_TYPES_DISPLAYED_CORRECTLY,
+ substrs = ['name = "MyString"',
+ 'compiler_type = "@interface MyString',
+ 'NSString * str;',
+ 'NSDate * date;'])
+
+ self.expect("frame variable --show-types --scope", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["ARG: (MyString *) self"],
+ patterns = ["ARG: \(.*\) _cmd",
+ "(objc_selector *)|(SEL)"])
+
+ # rdar://problem/8651752
+ # don't crash trying to ask clang how many children an empty record has
+ self.runCmd("frame variable *_cmd")
+
+ # rdar://problem/8492646
+ # test/foundation fails after updating to tot r115023
+ # self->str displays nothing as output
+ self.expect("frame variable --show-types self->str", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(NSString *) self->str")
+
+ # rdar://problem/8447030
+ # 'frame variable self->date' displays the wrong data member
+ self.expect("frame variable --show-types self->date", VARIABLES_DISPLAYED_CORRECTLY,
+ startstr = "(NSDate *) self->date")
+
+ # This should display the str and date member fields as well.
+ self.expect("frame variable --show-types *self", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["(MyString) *self",
+ "(NSString *) str",
+ "(NSDate *) date"])
+
+ # isa should be accessible.
+ self.expect("expression self->isa", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["(Class)"])
+
+ # This should fail expectedly.
+ self.expect("expression self->non_existent_member",
+ COMMAND_FAILED_AS_EXPECTED, error=True,
+ startstr = "error: 'MyString' does not have a member named 'non_existent_member'")
+
+ # Use expression parser.
+ self.runCmd("expression self->str")
+ self.runCmd("expression self->date")
+
+ # (lldb) expression self->str
+ # error: instance variable 'str' is protected
+ # error: 1 errors parsing expression
+ #
+ # (lldb) expression self->date
+ # error: instance variable 'date' is protected
+ # error: 1 errors parsing expression
+ #
+
+ self.runCmd("breakpoint delete 1")
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("process continue")
+
+ # rdar://problem/8542091
+ # test/foundation: expr -o -- my not working?
+ #
+ # Test new feature with r115115:
+ # Add "-o" option to "expression" which prints the object description if available.
+ self.expect("expression --object-description -- my", "Object description displayed correctly",
+ patterns = ["Hello from.*a.out.*with timestamp: "])
+
+ @add_test_categories(['pyapi'])
+ def test_print_ivars_correctly (self):
+ self.build()
+ # See: <rdar://problem/8717050> lldb needs to use the ObjC runtime symbols for ivar offsets
+ # Only fails for the ObjC 2.0 runtime.
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ break1 = target.BreakpointCreateByLocation(self.main_source, self.line)
+ self.assertTrue(break1, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread = process.GetThreadAtIndex(0)
+ if thread.GetStopReason() != lldb.eStopReasonBreakpoint:
+ from lldbsuite.test.lldbutil import stop_reason_to_str
+ self.fail(STOPPED_DUE_TO_BREAKPOINT_WITH_STOP_REASON_AS %
+ stop_reason_to_str(thread.GetStopReason()))
+
+ # Make sure we stopped at the first breakpoint.
+
+ cur_frame = thread.GetFrameAtIndex(0)
+
+ line_number = cur_frame.GetLineEntry().GetLine()
+ self.assertTrue (line_number == self.line, "Hit the first breakpoint.")
+
+ my_var = cur_frame.FindVariable("my")
+ self.assertTrue(my_var, "Made a variable object for my")
+
+ str_var = cur_frame.FindVariable("str")
+ self.assertTrue(str_var, "Made a variable object for str")
+
+ # Now make sure that the my->str == str:
+
+ my_str_var = my_var.GetChildMemberWithName("str")
+ self.assertTrue(my_str_var, "Found a str ivar in my")
+
+ str_value = int(str_var.GetValue(), 0)
+
+ my_str_value = int(my_str_var.GetValue(), 0)
+
+ self.assertTrue(str_value == my_str_value, "Got the correct value for my->str")
+
+ def test_expression_lookups_objc(self):
+ """Test running an expression detect spurious debug info lookups (DWARF)."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Stop at -[MyString initWithNSString:].
+ lldbutil.run_break_set_by_symbol (self, '-[MyString initWithNSString:]', num_expected_locations=1, sym_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ global file_index
+ # Log any DWARF lookups
+ ++file_index
+ logfile = os.path.join(os.getcwd(), "dwarf-lookups-" + self.getArchitecture() + "-" + str(file_index) + ".txt")
+ self.runCmd("log enable -f %s dwarf lookups" % (logfile))
+ self.runCmd("expr self")
+ self.runCmd("log disable dwarf lookups")
+
+ def cleanup():
+ if os.path.exists (logfile):
+ os.unlink (logfile)
+
+ self.addTearDownHook(cleanup)
+
+ if os.path.exists (logfile):
+ f = open(logfile)
+ lines = f.readlines()
+ num_errors = 0
+ for line in lines:
+ if string.find(line, "$__lldb") != -1:
+ if num_errors == 0:
+ print("error: found spurious name lookups when evaluating an expression:")
+ num_errors += 1
+ print(line, end='')
+ self.assertTrue(num_errors == 0, "Spurious lookups detected")
+ f.close()
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods2.py b/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods2.py
new file mode 100644
index 000000000000..b61a7702f1fe
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjCMethods2.py
@@ -0,0 +1,169 @@
+"""
+Test more expression command sequences with objective-c.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+@skipUnlessDarwin
+class FoundationTestCase2(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break at.
+ self.lines = []
+ self.lines.append(line_number('main.m', '// Break here for selector: tests'))
+ self.lines.append(line_number('main.m', '// Break here for NSArray tests'))
+ self.lines.append(line_number('main.m', '// Break here for NSString tests'))
+ self.lines.append(line_number('main.m', '// Break here for description test'))
+ self.lines.append(line_number('main.m', '// Set break point at this line'))
+
+ def test_more_expr_commands(self):
+ """More expression commands for objective-c."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Create a bunch of breakpoints.
+ for line in self.lines:
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # Test_Selector:
+ self.runCmd("thread backtrace")
+ self.expect("expression (char *)sel_getName(sel)",
+ substrs = ["(char *)",
+ "length"])
+
+ self.runCmd("process continue")
+
+ # Test_NSArray:
+ self.runCmd("thread backtrace")
+ self.runCmd("process continue")
+
+ # Test_NSString:
+ self.runCmd("thread backtrace")
+ self.runCmd("process continue")
+
+ # Test_MyString:
+ self.runCmd("thread backtrace")
+ self.expect("expression (char *)sel_getName(_cmd)",
+ substrs = ["(char *)",
+ "description"])
+
+ self.runCmd("process continue")
+
+ def test_NSArray_expr_commands(self):
+ """Test expression commands for NSArray."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside Test_NSArray:
+ line = self.lines[1]
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # Test_NSArray:
+ self.runCmd("thread backtrace")
+ self.expect("expression (int)[nil_mutable_array count]",
+ patterns = ["\(int\) \$.* = 0"])
+ self.expect("expression (int)[array1 count]",
+ patterns = ["\(int\) \$.* = 3"])
+ self.expect("expression (int)[array2 count]",
+ patterns = ["\(int\) \$.* = 3"])
+ self.expect("expression (int)array1.count",
+ patterns = ["\(int\) \$.* = 3"])
+ self.expect("expression (int)array2.count",
+ patterns = ["\(int\) \$.* = 3"])
+ self.runCmd("process continue")
+
+ def test_NSString_expr_commands(self):
+ """Test expression commands for NSString."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside Test_NSString:
+ line = self.lines[2]
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # Test_NSString:
+ self.runCmd("thread backtrace")
+ self.expect("expression (int)[str length]",
+ patterns = ["\(int\) \$.* ="])
+ self.expect("expression (int)[str_id length]",
+ patterns = ["\(int\) \$.* ="])
+ self.expect("expression [str description]",
+ patterns = ["\(id\) \$.* = 0x"])
+ self.expect("expression (id)[str_id description]",
+ patterns = ["\(id\) \$.* = 0x"])
+ self.expect("expression str.length")
+ self.expect("expression str.description")
+ self.expect('expression str = @"new"')
+ self.runCmd("image lookup -t NSString")
+ self.expect('expression str = [NSString stringWithCString: "new"]')
+ self.runCmd("process continue")
+
+ def test_MyString_dump(self):
+ """Test dump of a known Objective-C object by dereferencing it."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ line = self.lines[4]
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ self.expect("expression --show-types -- *my",
+ patterns = ["\(MyString\) \$.* = ", "\(MyBase\)", "\(NSObject\)", "\(Class\)"])
+ self.runCmd("process continue")
+
+ @expectedFailurei386
+ def test_NSError_po(self):
+ """Test that po of the result of an unknown method doesn't require a cast."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ line = self.lines[4]
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ self.expect('po [NSError errorWithDomain:@"Hello" code:35 userInfo:@{@"NSDescription" : @"be completed."}]',
+ substrs = ["Error Domain=Hello", "Code=35", "be completed."])
+ self.runCmd("process continue")
+
+ def test_NSError_p(self):
+ """Test that p of the result of an unknown method does require a cast."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ line = self.lines[4]
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ self.expect("p [NSError thisMethodIsntImplemented:0]",
+ error = True,
+ patterns = ["no known method", "cast the message send to the method's return type"])
+ self.runCmd("process continue")
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjectDescriptionAPI.py b/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjectDescriptionAPI.py
new file mode 100644
index 000000000000..a85f0fec9636
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/TestObjectDescriptionAPI.py
@@ -0,0 +1,71 @@
+"""
+Test SBValue.GetObjectDescription() with the value from SBTarget.FindGlobalVariables().
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class ObjectDescriptionAPITestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break at.
+ self.source = 'main.m'
+ self.line = line_number(self.source, '// Set break point at this line.')
+
+ # rdar://problem/10857337
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ def test_find_global_variables_then_object_description(self):
+ """Exercise SBTarget.FindGlobalVariables() API."""
+ d = {'EXE': 'b.out'}
+ self.build(dictionary=d)
+ self.setTearDownCleanup(dictionary=d)
+ exe = os.path.join(os.getcwd(), 'b.out')
+
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ breakpoint = target.BreakpointCreateByLocation(self.source, self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+ # Make sure we hit our breakpoint:
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, breakpoint)
+ self.assertTrue (len(thread_list) == 1)
+
+ thread = thread_list[0]
+ frame0 = thread.GetFrameAtIndex(0)
+
+ # Note my_global_str's object description prints fine here.
+ value_list1 = frame0.GetVariables(True, True, True, True)
+ for v in value_list1:
+ self.DebugSBValue(v)
+ if self.TraceOn():
+ print("val:", v)
+ print("object description:", v.GetObjectDescription())
+ if v.GetName() == 'my_global_str':
+ self.assertTrue(v.GetObjectDescription() == 'This is a global string')
+
+ # But not here!
+ value_list2 = target.FindGlobalVariables('my_global_str', 3)
+ for v in value_list2:
+ self.DebugSBValue(v)
+ if self.TraceOn():
+ print("val:", v)
+ print("object description:", v.GetObjectDescription())
+ if v.GetName() == 'my_global_str':
+ self.assertTrue(v.GetObjectDescription() == 'This is a global string')
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/TestRuntimeTypes.py b/packages/Python/lldbsuite/test/lang/objc/foundation/TestRuntimeTypes.py
new file mode 100644
index 000000000000..8f191721d89b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/TestRuntimeTypes.py
@@ -0,0 +1,48 @@
+"""
+Test that Objective-C methods from the runtime work correctly.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+@skipUnlessDarwin
+class RuntimeTypesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def test_break(self):
+ """Test setting objc breakpoints using '_regexp-break' and 'breakpoint set'."""
+ if self.getArchitecture() != 'x86_64':
+ self.skipTest("This only applies to the v2 runtime")
+
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Stop at -[MyString description].
+ lldbutil.run_break_set_by_symbol (self, '-[MyString description]', num_expected_locations=1, sym_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The backtrace should show we stop at -[MyString description].
+ self.expect("thread backtrace", "Stop at -[MyString description]",
+ substrs = ["a.out`-[MyString description]"])
+
+ # Use runtime information about NSString.
+
+ # The length property should be usable.
+ self.expect("expression str.length", VARIABLES_DISPLAYED_CORRECTLY,
+ patterns = [r"(\(unsigned long long\))|\(NSUInteger\)"])
+
+ # Static methods on NSString should work.
+ self.expect("expr [NSString stringWithCString:\"foo\" encoding:1]", VALID_TYPE,
+ substrs = ["(id)", "$1"])
+
+ self.expect("po $1", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["foo"])
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/TestSymbolTable.py b/packages/Python/lldbsuite/test/lang/objc/foundation/TestSymbolTable.py
new file mode 100644
index 000000000000..72952c1878b1
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/TestSymbolTable.py
@@ -0,0 +1,68 @@
+"""
+Test symbol table access for main.m.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+
+@skipUnlessDarwin
+class FoundationSymtabTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ symbols_list = ['-[MyString initWithNSString:]',
+ '-[MyString dealloc]',
+ '-[MyString description]',
+ '-[MyString descriptionPauses]', # synthesized property
+ '-[MyString setDescriptionPauses:]', # synthesized property
+ 'Test_Selector',
+ 'Test_NSString',
+ 'Test_MyString',
+ 'Test_NSArray',
+ 'main'
+ ]
+
+ @add_test_categories(['pyapi'])
+ def test_with_python_api(self):
+ """Test symbol table access with Python APIs."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Launch the process, and do not stop at the entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ #
+ # Exercise Python APIs to access the symbol table entries.
+ #
+
+ # Create the filespec by which to locate our a.out module.
+ filespec = lldb.SBFileSpec(exe, False)
+
+ module = target.FindModule(filespec)
+ self.assertTrue(module, VALID_MODULE)
+
+ # Create the set of known symbols. As we iterate through the symbol
+ # table, remove the symbol from the set if it is a known symbol.
+ expected_symbols = set(self.symbols_list)
+ for symbol in module:
+ self.assertTrue(symbol, VALID_SYMBOL)
+ #print("symbol:", symbol)
+ name = symbol.GetName()
+ if name in expected_symbols:
+ #print("Removing %s from known_symbols %s" % (name, expected_symbols))
+ expected_symbols.remove(name)
+
+ # At this point, the known_symbols set should have become an empty set.
+ # If not, raise an error.
+ #print("symbols unaccounted for:", expected_symbols)
+ self.assertTrue(len(expected_symbols) == 0,
+ "All the known symbols are accounted for")
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/const-strings.m b/packages/Python/lldbsuite/test/lang/objc/foundation/const-strings.m
new file mode 100644
index 000000000000..8a43abee7b84
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/const-strings.m
@@ -0,0 +1,24 @@
+#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 %lu", str, [str length]); // Set breakpoint here.
+
+ [pool drain];
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/main.m b/packages/Python/lldbsuite/test/lang/objc/foundation/main.m
new file mode 100644
index 000000000000..519bec5a3e6a
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/main.m
@@ -0,0 +1,141 @@
+#import <Foundation/Foundation.h>
+#include <unistd.h>
+#import "my-base.h"
+
+@interface MyString : MyBase {
+ NSString *str;
+ NSDate *date;
+ BOOL _desc_pauses;
+}
+
+@property(retain) NSString * str_property;
+@property BOOL descriptionPauses;
+
+- (id)initWithNSString:(NSString *)string;
+@end
+
+@implementation MyString
+@synthesize descriptionPauses = _desc_pauses;
+@synthesize str_property = str;
+
+- (id)initWithNSString:(NSString *)string
+{
+ if (self = [super init])
+ {
+ str = [NSString stringWithString:string];
+ date = [NSDate date];
+ }
+ self.descriptionPauses = NO;
+ return self;
+}
+
+- (void)dealloc
+{
+ [date release];
+ [str release];
+ [super dealloc];
+}
+
+- (NSString *)description
+{
+ // Set a breakpoint on '-[MyString description]' and test expressions:
+ // expression (char *)sel_getName(_cmd)
+ if (self.descriptionPauses) // Break here for description test
+ {
+ printf ("\nAbout to sleep.\n");
+ usleep(100000);
+ }
+
+ return [str stringByAppendingFormat:@" with timestamp: %@", date];
+}
+@end
+
+int
+Test_Selector ()
+{
+ SEL sel = @selector(length);
+ printf("sel = %p\n", sel);
+ // Expressions to test here for selector:
+ // expression (char *)sel_getName(sel)
+ // The expression above should return "sel" as it should be just
+ // a uniqued C string pointer. We were seeing the result pointer being
+ // truncated with recent LLDBs.
+ return 0; // Break here for selector: tests
+}
+
+int
+Test_NSString (const char *program)
+{
+ NSString *str = [NSString stringWithFormat:@"Hello from '%s'", program];
+ NSLog(@"NSString instance: %@", str);
+ printf("str = '%s'\n", [str cStringUsingEncoding: [NSString defaultCStringEncoding]]);
+ printf("[str length] = %zu\n", (size_t)[str length]);
+ printf("[str description] = %s\n", [[str description] UTF8String]);
+ id str_id = str;
+ // Expressions to test here for NSString:
+ // expression (char *)sel_getName(sel)
+ // expression [str length]
+ // expression [str_id length]
+ // expression [str description]
+ // expression [str_id description]
+ // expression str.length
+ // expression str.description
+ // expression str = @"new"
+ // expression str = [NSString stringWithFormat: @"%cew", 'N']
+ return 0; // Break here for NSString tests
+}
+
+NSString *my_global_str = NULL;
+
+void
+Test_MyString (const char *program)
+{
+ my_global_str = @"This is a global string";
+ NSString *str = [NSString stringWithFormat:@"Hello from '%s'", program];
+ MyString *my = [[MyString alloc] initWithNSString:str];
+ NSLog(@"MyString instance: %@", [my description]);
+ my.descriptionPauses = YES; // Set break point at this line. Test 'expression -o -- my'.
+ NSLog(@"MyString instance: %@", [my description]);
+}
+
+int
+Test_NSArray ()
+{
+ NSMutableArray *nil_mutable_array = nil;
+ NSArray *array1 = [NSArray arrayWithObjects: @"array1 object1", @"array1 object2", @"array1 object3", nil];
+ NSArray *array2 = [NSArray arrayWithObjects: array1, @"array2 object2", @"array2 object3", nil];
+ // Expressions to test here for NSArray:
+ // expression [nil_mutable_array count]
+ // expression [array1 count]
+ // expression array1.count
+ // expression [array2 count]
+ // expression array2.count
+ id obj;
+ // After each object at index call, use expression and validate object
+ obj = [array1 objectAtIndex: 0]; // Break here for NSArray tests
+ obj = [array1 objectAtIndex: 1];
+ obj = [array1 objectAtIndex: 2];
+
+ obj = [array2 objectAtIndex: 0];
+ obj = [array2 objectAtIndex: 1];
+ obj = [array2 objectAtIndex: 2];
+ NSUInteger count = [nil_mutable_array count];
+ return 0;
+}
+
+
+int main (int argc, char const *argv[])
+{
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ Test_Selector();
+ Test_NSArray ();
+ Test_NSString (argv[0]);
+ Test_MyString (argv[0]);
+
+ printf("sizeof(id) = %zu\n", sizeof(id));
+ printf("sizeof(Class) = %zu\n", sizeof(Class));
+ printf("sizeof(SEL) = %zu\n", sizeof(SEL));
+
+ [pool release];
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/my-base.h b/packages/Python/lldbsuite/test/lang/objc/foundation/my-base.h
new file mode 100644
index 000000000000..53202aa0de37
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/my-base.h
@@ -0,0 +1,8 @@
+@interface MyBase : NSObject
+{
+#if !__OBJC2__
+ int maybe_used; // The 1.0 runtime needs to have backed properties...
+#endif
+}
+@property int propertyMovesThings;
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/foundation/my-base.m b/packages/Python/lldbsuite/test/lang/objc/foundation/my-base.m
new file mode 100644
index 000000000000..0c316b244f26
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/foundation/my-base.m
@@ -0,0 +1,10 @@
+#import <Foundation/Foundation.h>
+#import "my-base.h"
+@implementation MyBase
+#if __OBJC2__
+@synthesize propertyMovesThings;
+#else
+@synthesize propertyMovesThings = maybe_used;
+#endif
+@end
+
diff --git a/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/InternalDefiner.h b/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/InternalDefiner.h
new file mode 100644
index 000000000000..59652d4b09c0
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/InternalDefiner.h
@@ -0,0 +1,11 @@
+#import <Foundation/Foundation.h>
+#import <stdint.h>
+
+@interface InternalDefiner : NSObject {
+@public
+ uintptr_t foo;
+}
+
+-(id)initWithFoo:(uintptr_t)f andBar:(uintptr_t)b;
+
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/InternalDefiner.m b/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/InternalDefiner.m
new file mode 100644
index 000000000000..1a10ce021ce3
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/InternalDefiner.m
@@ -0,0 +1,31 @@
+#import "InternalDefiner.h"
+
+@interface InternalDefiner () {
+ uintptr_t bar;
+}
+
+@end
+
+@implementation InternalDefiner
+
+-(id)init
+{
+ if (self = [super init])
+ {
+ foo = 2;
+ bar = 3;
+ }
+ return self;
+}
+
+-(id)initWithFoo:(uintptr_t)f andBar:(uintptr_t)b
+{
+ if (self = [super init])
+ {
+ foo = f;
+ bar = b;
+ }
+ return self;
+}
+
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/Makefile b/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/Makefile
new file mode 100644
index 000000000000..1768d11ca279
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/Makefile
@@ -0,0 +1,9 @@
+LEVEL = ../../../make
+
+DYLIB_NAME := InternalDefiner
+DYLIB_OBJC_SOURCES := InternalDefiner.m
+OBJC_SOURCES := main.m
+
+LD_EXTRAS = -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/TestHiddenIvars.py b/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/TestHiddenIvars.py
new file mode 100644
index 000000000000..e85dd8f48dec
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/TestHiddenIvars.py
@@ -0,0 +1,174 @@
+"""Test that hidden ivars in a shared library are visible from the main executable."""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+import subprocess
+
+class HiddenIvarsTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.source = 'main.m'
+ self.line = line_number(self.source, '// breakpoint1')
+ # The makefile names of the shared libraries as they appear in DYLIB_NAME.
+ # The names should have no loading "lib" or extension as they will be localized
+ self.shlib_names = ["InternalDefiner"]
+
+ @skipUnlessDarwin
+ @skipIfDwarf # This test requires a stripped binary and a dSYM
+ @skipIfDWO # This test requires a stripped binary and a dSYM
+ def test_expr_stripped(self):
+ if self.getArchitecture() == 'i386':
+ self.skipTest("requires modern objc runtime")
+ else:
+ self.build()
+ self.expr(True)
+
+ @skipUnlessDarwin
+ def test_expr(self):
+ if self.getArchitecture() == 'i386':
+ self.skipTest("requires modern objc runtime")
+ else:
+ self.build()
+ self.expr(False)
+
+ @skipUnlessDarwin
+ @skipIfDwarf # This test requires a stripped binary and a dSYM
+ @skipIfDWO # This test requires a stripped binary and a dSYM
+ def test_frame_variable_stripped(self):
+ if self.getArchitecture() == 'i386':
+ self.skipTest("requires modern objc runtime")
+ else:
+ self.build()
+ self.frame_var(True)
+
+ @skipUnlessDarwin
+ def test_frame_variable(self):
+ if self.getArchitecture() == 'i386':
+ self.skipTest("requires modern objc runtime")
+ else:
+ self.build()
+ self.frame_var(False)
+
+ @unittest2.expectedFailure("rdar://18683637")
+ @skipUnlessDarwin
+ def test_frame_variable_across_modules(self):
+ if self.getArchitecture() == 'i386':
+ self.skipTest("requires modern objc runtime")
+ else:
+ self.build()
+ self.common_setup(False)
+ self.expect("frame variable k->bar", VARIABLES_DISPLAYED_CORRECTLY, substrs = ["= 3"])
+
+ def common_setup(self, strip):
+
+ if strip:
+ self.assertTrue(subprocess.call(['/usr/bin/strip', '-Sx', 'libInternalDefiner.dylib']) == 0, 'stripping dylib succeeded')
+ self.assertTrue(subprocess.call(['/bin/rm', '-rf', 'libInternalDefiner.dylib.dSYM']) == 0, 'remove dylib dSYM file succeeded')
+ self.assertTrue(subprocess.call(['/usr/bin/strip', '-Sx', 'a.out']) == 0, 'stripping a.out succeeded')
+ # Create a target by the debugger.
+ target = self.dbg.CreateTarget("a.out")
+ self.assertTrue(target, VALID_TARGET)
+
+ # Create the breakpoint inside function 'main'.
+ breakpoint = target.BreakpointCreateByLocation(self.source, self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ # Register our shared libraries for remote targets so they get automatically uploaded
+ environment = self.registerSharedLibrariesWithTarget(target, self.shlib_names)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, environment, self.get_process_working_directory())
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ def expr(self, strip):
+ self.common_setup(strip)
+
+ # This should display correctly.
+ self.expect("expression (j->_definer->foo)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 4"])
+
+ self.expect("expression (j->_definer->bar)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 5"])
+
+ if strip:
+ self.expect("expression *(j->_definer)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["foo = 4"])
+ else:
+ self.expect("expression *(j->_definer)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["foo = 4", "bar = 5"])
+
+ self.expect("expression (k->foo)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 2"])
+
+ self.expect("expression (k->bar)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 3"])
+
+ self.expect("expression k.filteredDataSource", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = [' = 0x', '"2 elements"'])
+
+ if strip:
+ self.expect("expression *(k)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["foo = 2", ' = 0x', '"2 elements"'])
+ else:
+ self.expect("expression *(k)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["foo = 2", "bar = 3", '_filteredDataSource = 0x', '"2 elements"'])
+
+ def frame_var(self, strip):
+ self.common_setup(strip)
+
+ # This should display correctly.
+ self.expect("frame variable j->_definer->foo", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 4"])
+
+ if not strip:
+ self.expect("frame variable j->_definer->bar", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 5"])
+
+ if strip:
+ self.expect("frame variable *j->_definer", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["foo = 4"])
+ else:
+ self.expect("frame variable *j->_definer", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["foo = 4", "bar = 5"])
+
+ self.expect("frame variable k->foo", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["= 2"])
+
+ self.expect("frame variable k->_filteredDataSource", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = [' = 0x', '"2 elements"'])
+
+ if strip:
+ self.expect("frame variable *k", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["foo = 2", '_filteredDataSource = 0x', '"2 elements"'])
+ else:
+ self.expect("frame variable *k", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["foo = 2", "bar = 3", '_filteredDataSource = 0x', '"2 elements"'])
diff --git a/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/main.m b/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/main.m
new file mode 100644
index 000000000000..1795d56e7d8a
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/hidden-ivars/main.m
@@ -0,0 +1,54 @@
+#import <Foundation/Foundation.h>
+#import "InternalDefiner.h"
+
+@interface Container : NSObject {
+@public
+ InternalDefiner *_definer;
+}
+
+-(id)init;
+@end
+
+@implementation Container
+
+-(id)init
+{
+ if (self = [super init])
+ {
+ _definer = [[InternalDefiner alloc] initWithFoo:4 andBar:5];
+ }
+ return self;
+}
+
+@end
+
+@interface InheritContainer : InternalDefiner
+@property (nonatomic, strong) NSMutableArray *filteredDataSource;
+-(id)init;
+@end
+
+@implementation InheritContainer
+
+-(id)init
+{
+ if (self = [super initWithFoo:2 andBar:3])
+ {
+ self.filteredDataSource = [NSMutableArray arrayWithObjects:@"hello", @"world", nil];
+ }
+ return self;
+}
+
+@end
+
+int main(int argc, const char * argv[])
+{
+ @autoreleasepool {
+ Container *j = [[Container alloc] init];
+ InheritContainer *k = [[InheritContainer alloc] init];
+
+ printf("ivar value = %u\n", (unsigned)j->_definer->foo); // breakpoint1
+ printf("ivar value = %u\n", (unsigned)k->foo);
+ }
+ return 0;
+}
+
diff --git a/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/Makefile b/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/Makefile
new file mode 100644
index 000000000000..329ceabeea97
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/Makefile
@@ -0,0 +1,12 @@
+LEVEL = ../../../make
+
+myclass.o: myclass.h myclass.m
+ $(CC) myclass.m -c -o myclass.o
+
+repro: myclass.o repro.m
+ $(CC) -g -O0 myclass.o repro.m -framework Foundation
+
+cleanup:
+ rm -r myclass.o
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/TestObjCiVarIMP.py b/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/TestObjCiVarIMP.py
new file mode 100644
index 000000000000..9ed2bb98e6e1
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/TestObjCiVarIMP.py
@@ -0,0 +1,63 @@
+"""
+Test that dynamically discovered ivars of type IMP do not crash LLDB
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+import lldbsuite.support.seven as seven
+
+def execute_command (command):
+ # print('%% %s' % (command))
+ (exit_status, output) = seven.get_command_status_output(command)
+ # if output:
+ # print(output)
+ # print('status = %u' % (exit_status))
+ return exit_status
+
+class ObjCiVarIMPTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipUnlessDarwin
+ @no_debug_info_test
+ def test_imp_ivar_type(self):
+ """Test that dynamically discovered ivars of type IMP do not crash LLDB"""
+ if self.getArchitecture() == 'i386':
+ # rdar://problem/9946499
+ self.skipTest("Dynamic types for ObjC V1 runtime not implemented")
+
+ execute_command("make repro")
+ def cleanup():
+ execute_command("make cleanup")
+ self.addTearDownHook(cleanup)
+
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target from the debugger.
+ target = self.dbg.CreateTarget (exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Set up our breakpoint
+
+ bkpt = lldbutil.run_break_set_by_source_regexp (self, "break here")
+
+ # Now launch the process, and do not stop at the entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process.GetState() == lldb.eStateStopped,
+ PROCESS_STOPPED)
+
+ self.expect('frame variable --ptr-depth=1 --show-types -d run -- object', substrs=[
+ '(MyClass *) object = 0x',
+ '(void *) myImp = 0x'
+ ])
+ self.expect('disassemble --start-address `((MyClass*)object)->myImp`', substrs=[
+ '-[MyClass init]'
+ ])
diff --git a/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/myclass.h b/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/myclass.h
new file mode 100644
index 000000000000..da28d1e05181
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/myclass.h
@@ -0,0 +1,6 @@
+#import <Foundation/Foundation.h>
+
+@interface MyClass : NSObject
+{}
+- (id)init;
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/myclass.m b/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/myclass.m
new file mode 100644
index 000000000000..85b2fcfe9b3c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/myclass.m
@@ -0,0 +1,16 @@
+#import <Foundation/Foundation.h>
+#import "myclass.h"
+
+@implementation MyClass
+{
+ IMP myImp;
+}
+- (id)init {
+ if (self = [super init])
+ {
+ SEL theSelector = @selector(init);
+ self->myImp = [self methodForSelector:theSelector];
+ }
+ return self;
+}
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/repro.m b/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/repro.m
new file mode 100644
index 000000000000..14f911f07dd8
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/ivar-IMP/repro.m
@@ -0,0 +1,7 @@
+#import <Foundation/Foundation.h>
+#import "myclass.h"
+
+int main() {
+ id object = [MyClass new];
+ return 0; // break here
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-auto-import/Makefile b/packages/Python/lldbsuite/test/lang/objc/modules-auto-import/Makefile
new file mode 100644
index 000000000000..e42b59f9518c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-auto-import/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+OBJC_SOURCES := main.m
+
+CFLAGS += -fmodules -gmodules -g
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-auto-import/TestModulesAutoImport.py b/packages/Python/lldbsuite/test/lang/objc/modules-auto-import/TestModulesAutoImport.py
new file mode 100644
index 000000000000..2c052aae3ba1
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-auto-import/TestModulesAutoImport.py
@@ -0,0 +1,53 @@
+"""Test that importing modules in Objective-C works as expected."""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+import platform
+import lldbsuite.test.lldbutil as lldbutil
+
+from distutils.version import StrictVersion
+
+from lldbsuite.test.lldbtest import *
+
+class ObjCModulesAutoImportTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.m', '// Set breakpoint 0 here.')
+
+ @skipUnlessDarwin
+ @unittest2.expectedFailure("rdar://problem/19991953")
+ @expectedFailureDarwin # clang: error: unknown argument: '-gmodules'
+ @unittest2.skipIf(platform.system() != "Darwin" or StrictVersion('12.0.0') > platform.release(), "Only supported on Darwin 12.0.0+")
+ def test_expr(self):
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ self.runCmd("settings set target.auto-import-clang-modules true")
+
+ self.expect("p getpid()", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["pid_t"])
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-auto-import/main.m b/packages/Python/lldbsuite/test/lang/objc/modules-auto-import/main.m
new file mode 100644
index 000000000000..5452ffd9bd15
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-auto-import/main.m
@@ -0,0 +1,7 @@
+@import Darwin;
+
+int main()
+{
+ size_t ret = printf("Stop here\n"); // Set breakpoint 0 here.
+ return ret;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/Makefile b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/Makefile
new file mode 100644
index 000000000000..cbd95de007d8
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/Makefile
@@ -0,0 +1,8 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m myModule.m
+
+include $(LEVEL)/Makefile.rules
+
+CFLAGS += -fmodules -I$(PWD)
+LDFLAGS += -framework Foundation
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/TestIncompleteModules.py b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/TestIncompleteModules.py
new file mode 100644
index 000000000000..8667e628d464
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/TestIncompleteModules.py
@@ -0,0 +1,61 @@
+"""Test that DWARF types are trusted over module types"""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+import platform
+import lldbsuite.test.lldbutil as lldbutil
+
+from distutils.version import StrictVersion
+
+from lldbsuite.test.lldbtest import *
+
+class IncompleteModulesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.m', '// Set breakpoint 0 here.')
+
+ @skipUnlessDarwin
+ @unittest2.expectedFailure("rdar://20416388")
+ @unittest2.skipIf(platform.system() != "Darwin" or StrictVersion('12.0.0') > platform.release(), "Only supported on Darwin 12.0.0+")
+ def test_expr(self):
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ self.runCmd("settings set target.clang-module-search-paths \"" + os.getcwd() + "\"")
+
+ self.expect("expr @import myModule; 3", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["int", "3"])
+
+ self.expect("expr [myObject privateMethod]", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["int", "5"])
+
+ self.expect("expr MIN(2,3)", "#defined macro was found",
+ substrs = ["int", "2"])
+
+ self.expect("expr MAX(2,3)", "#undefd macro was correcltly not found",
+ error=True)
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/main.m b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/main.m
new file mode 100644
index 000000000000..8ebfb0c1f11a
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/main.m
@@ -0,0 +1,11 @@
+@import Foundation;
+@import myModule;
+
+int main()
+{
+ @autoreleasepool
+ {
+ MyClass *myObject = [MyClass alloc];
+ [myObject publicMethod]; // Set breakpoint 0 here.
+ }
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/module.map b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/module.map
new file mode 100644
index 000000000000..2ef8064d15b4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/module.map
@@ -0,0 +1,4 @@
+module myModule {
+ header "myModule.h"
+ export *
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/myModule.h b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/myModule.h
new file mode 100644
index 000000000000..d03dde0d07aa
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/myModule.h
@@ -0,0 +1,8 @@
+@import Foundation;
+
+#undef MAX
+
+@interface MyClass : NSObject {
+};
+-(void)publicMethod;
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/myModule.m b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/myModule.m
new file mode 100644
index 000000000000..d6a2619d8016
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-incomplete/myModule.m
@@ -0,0 +1,14 @@
+#include "myModule.h"
+#include "stdio.h"
+
+@implementation MyClass {
+};
+-(void)publicMethod {
+ printf("Hello public!\n");
+}
+-(int)privateMethod {
+ printf("Hello private!\n");
+ return 5;
+}
+@end
+
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/Makefile b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/Makefile
new file mode 100644
index 000000000000..6ad9e0010bb0
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/Makefile
@@ -0,0 +1,9 @@
+LEVEL = ../../../make
+
+C_SOURCES := myModule.c
+
+OBJC_SOURCES := main.m
+
+include $(LEVEL)/Makefile.rules
+
+CFLAGS += -fmodules -I$(PWD)
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/TestModulesInlineFunctions.py b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/TestModulesInlineFunctions.py
new file mode 100644
index 000000000000..d9d94a8cf321
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/TestModulesInlineFunctions.py
@@ -0,0 +1,55 @@
+"""Test that inline functions from modules are imported correctly"""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+import platform
+import lldbsuite.test.lldbutil as lldbutil
+
+from distutils.version import StrictVersion
+
+from lldbsuite.test.lldbtest import *
+
+class ModulesInlineFunctionsTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.m', '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ @unittest2.skipIf(platform.system() != "Darwin" or StrictVersion('12.0.0') > platform.release(), "Only supported on Darwin 12.0.0+")
+ @expectedFailureDarwin("llvm.org/pr25743")
+ def test_expr(self):
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ self.runCmd("settings set target.clang-module-search-paths \"" + os.getcwd() + "\"")
+
+ self.expect("expr @import myModule; 3", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["int", "3"])
+
+ self.expect("expr isInline(2)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["4"])
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/main.m b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/main.m
new file mode 100644
index 000000000000..13a5bf316ee9
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/main.m
@@ -0,0 +1,9 @@
+@import Darwin;
+@import myModule;
+
+int main()
+{
+ int a = isInline(2);
+ int b = notInline();
+ printf("%d %d\n", a, b); // Set breakpoint here.
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/module.map b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/module.map
new file mode 100644
index 000000000000..2ef8064d15b4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/module.map
@@ -0,0 +1,4 @@
+module myModule {
+ header "myModule.h"
+ export *
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/myModule.c b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/myModule.c
new file mode 100644
index 000000000000..ad3c85d155e4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/myModule.c
@@ -0,0 +1,7 @@
+#include "myModule.h"
+
+int notInline()
+{
+ return 3;
+}
+
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/myModule.h b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/myModule.h
new file mode 100644
index 000000000000..d50d0101f645
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules-inline-functions/myModule.h
@@ -0,0 +1,7 @@
+int notInline();
+
+static __inline__ __attribute__ ((always_inline)) int isInline(int a)
+{
+ int b = a + a;
+ return b;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules/Makefile b/packages/Python/lldbsuite/test/lang/objc/modules/Makefile
new file mode 100644
index 000000000000..ad3cb3fadcde
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules/Makefile
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+
+include $(LEVEL)/Makefile.rules
+
+LDFLAGS += -framework Foundation
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules/TestObjCModules.py b/packages/Python/lldbsuite/test/lang/objc/modules/TestObjCModules.py
new file mode 100644
index 000000000000..04fc07281811
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules/TestObjCModules.py
@@ -0,0 +1,71 @@
+"""Test that importing modules in Objective-C works as expected."""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+import platform
+import lldbsuite.test.lldbutil as lldbutil
+
+from distutils.version import StrictVersion
+
+from lldbsuite.test.lldbtest import *
+
+class ObjCModulesTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.m', '// Set breakpoint 0 here.')
+
+ @skipUnlessDarwin
+ @unittest2.expectedFailure("rdar://20416388")
+ @unittest2.skipIf(platform.system() != "Darwin" or StrictVersion('12.0.0') > platform.release(), "Only supported on Darwin 12.0.0+")
+ def test_expr(self):
+ if not self.applies():
+ return
+
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ self.expect("expr @import Darwin; 3", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["int", "3"])
+
+ self.expect("expr getpid()", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["pid_t"])
+
+ self.expect("expr @import Foundation; 4", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["int", "4"])
+
+ self.expect("expr string.length", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["NSUInteger", "5"])
+
+ self.expect("expr array.count", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["NSUInteger", "3"])
+
+ self.expect("p *[NSURL URLWithString:@\"http://lldb.llvm.org\"]", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["NSURL", "isa", "_urlString"])
+
+ self.expect("p [NSURL URLWithString:@\"http://lldb.llvm.org\"].scheme", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["http"])
diff --git a/packages/Python/lldbsuite/test/lang/objc/modules/main.m b/packages/Python/lldbsuite/test/lang/objc/modules/main.m
new file mode 100644
index 000000000000..99b50f9620d6
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/modules/main.m
@@ -0,0 +1,12 @@
+#import <Foundation/Foundation.h>
+
+int main()
+{
+ @autoreleasepool
+ {
+ NSString *string = @"Hello";
+ NSArray *array = @[ @1, @2, @3 ];
+
+ NSLog(@"Stop here"); // Set breakpoint 0 here.
+ }
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc++/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc++/Makefile
new file mode 100644
index 000000000000..910d4943ef05
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc++/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJCXX_SOURCES := main.mm
+LD_EXTRAS = -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc++/TestObjCXX.py b/packages/Python/lldbsuite/test/lang/objc/objc++/TestObjCXX.py
new file mode 100644
index 000000000000..38ef853ae112
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc++/TestObjCXX.py
@@ -0,0 +1,33 @@
+"""
+Make sure that ivars of Objective-C++ classes are visible in LLDB.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class ObjCXXTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipUnlessDarwin
+ def test_break(self):
+ """Test ivars of Objective-C++ classes"""
+ if self.getArchitecture() == 'i386':
+ self.skipTest("requires Objective-C 2.0 runtime")
+
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_source_regexp (self, 'breakpoint 1', num_expected_locations=1)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ self.expect("expr f->f", "Found ivar in class",
+ substrs = ["= 3"])
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc++/main.mm b/packages/Python/lldbsuite/test/lang/objc/objc++/main.mm
new file mode 100644
index 000000000000..50d2f0a8df37
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc++/main.mm
@@ -0,0 +1,19 @@
+#include <Foundation/NSObject.h>
+
+@interface F : NSObject
+@end
+
+@implementation F
+{
+@public
+ int f;
+}
+
+@end
+
+int main(int argc, char* argv[])
+{
+ F* f = [F new];
+ f->f = 3;
+ return 0; // breakpoint 1
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/Makefile
new file mode 100644
index 000000000000..7f7baeb3cf1c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+LD_EXTRAS = -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/TestObjCBaseClassSBType.py b/packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/TestObjCBaseClassSBType.py
new file mode 100644
index 000000000000..5d2414eed8f5
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/TestObjCBaseClassSBType.py
@@ -0,0 +1,58 @@
+"""
+Use lldb Python API to test base class resolution for ObjC classes
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class ObjCDynamicValueTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+
+ self.line = line_number('main.m', '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ def test_get_baseclass(self):
+ """Test fetching ObjC dynamic values."""
+ if self.getArchitecture() == 'i386':
+ # rdar://problem/9946499
+ self.skipTest("Dynamic types for ObjC V1 runtime not implemented")
+
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target from the debugger.
+
+ target = self.dbg.CreateTarget (exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Set up our breakpoints:
+
+ target.BreakpointCreateByLocation('main.m', self.line)
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process.GetState() == lldb.eStateStopped,
+ PROCESS_STOPPED)
+
+ var = self.frame().FindVariable("foo")
+ var_ptr_type = var.GetType()
+ var_pte_type = var_ptr_type.GetPointeeType()
+ self.assertTrue(var_ptr_type.GetNumberOfDirectBaseClasses() == 1, "Foo * has one base class")
+ self.assertTrue(var_pte_type.GetNumberOfDirectBaseClasses() == 1, "Foo has one base class")
+
+ self.assertTrue(var_ptr_type.GetDirectBaseClassAtIndex(0).IsValid(), "Foo * has a valid base class")
+ self.assertTrue(var_pte_type.GetDirectBaseClassAtIndex(0).IsValid(), "Foo * has a valid base class")
+
+ self.assertTrue(var_ptr_type.GetDirectBaseClassAtIndex(0).GetName() == var_pte_type.GetDirectBaseClassAtIndex(0).GetName(), "Foo and its pointer type don't agree on their base class")
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/main.m b/packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/main.m
new file mode 100644
index 000000000000..3ec78fd0bd6b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-baseclass-sbtype/main.m
@@ -0,0 +1,22 @@
+#import <Foundation/Foundation.h>
+
+@interface Foo : NSObject {}
+
+-(id) init;
+
+@end
+
+@implementation Foo
+
+-(id) init
+{
+ return self = [super init];
+}
+@end
+int main ()
+{
+ Foo *foo = [Foo new];
+ NSLog(@"a"); // Set breakpoint here.
+ return 0;
+}
+
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/Makefile
new file mode 100644
index 000000000000..314f1cb2f077
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/Makefile
@@ -0,0 +1,5 @@
+LEVEL = ../../../make
+
+CXX_SOURCES := main.cpp
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/TestObjCBuiltinTypes.py b/packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/TestObjCBuiltinTypes.py
new file mode 100644
index 000000000000..f7ce2809081a
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/TestObjCBuiltinTypes.py
@@ -0,0 +1,55 @@
+"""Test that the expression parser doesn't get confused by 'id' and 'Class'"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestObjCBuiltinTypes(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "main.cpp"
+ self.break_line = line_number(self.main_source, '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ #<rdar://problem/10591460> [regression] Can't print ivar value: error: reference to 'id' is ambiguous
+ def test_with_python_api(self):
+ """Test expression parser respect for ObjC built-in types."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ bpt = target.BreakpointCreateByLocation(self.main_source, self.break_line)
+ self.assertTrue(bpt, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, bpt)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ # Now make sure we can call a function in the class method we've stopped in.
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ self.expect("expr (foo)", patterns = ["\(ns::id\) \$.* = 0"])
+
+ self.expect("expr id my_id = 0; my_id", patterns = ["\(id\) \$.* = nil"])
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/main.cpp b/packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/main.cpp
new file mode 100644
index 000000000000..6dd8cbc6e9fe
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-builtin-types/main.cpp
@@ -0,0 +1,9 @@
+namespace ns {
+ typedef int id;
+};
+
+int main()
+{
+ ns::id foo = 0;
+ return foo; // Set breakpoint here.
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-checker/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-checker/Makefile
new file mode 100644
index 000000000000..a1608fe5a664
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-checker/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-checker/TestObjCCheckers.py b/packages/Python/lldbsuite/test/lang/objc/objc-checker/TestObjCCheckers.py
new file mode 100644
index 000000000000..533ec2f6b7c4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-checker/TestObjCCheckers.py
@@ -0,0 +1,75 @@
+"""
+Use lldb Python API to make sure the dynamic checkers are doing their jobs.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class ObjCCheckerTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+
+ # Find the line number to break for main.c.
+ self.source_name = 'main.m'
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ def test_objc_checker(self):
+ """Test that checkers catch unrecognized selectors"""
+ if self.getArchitecture() == 'i386':
+ self.skipTest("requires Objective-C 2.0 runtime")
+
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target from the debugger.
+
+ target = self.dbg.CreateTarget (exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Set up our breakpoints:
+
+
+ main_bkpt = target.BreakpointCreateBySourceRegex ("Set a breakpoint here.", lldb.SBFileSpec (self.source_name))
+ self.assertTrue(main_bkpt and
+ main_bkpt.GetNumLocations() == 1,
+ VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at the entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process.GetState() == lldb.eStateStopped,
+ PROCESS_STOPPED)
+
+ threads = lldbutil.get_threads_stopped_at_breakpoint (process, main_bkpt)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+
+ #
+ # The class Simple doesn't have a count method. Make sure that we don't
+ # actually try to send count but catch it as an unrecognized selector.
+
+ frame = thread.GetFrameAtIndex(0)
+ expr_value = frame.EvaluateExpression("(int) [my_simple count]", False)
+ expr_error = expr_value.GetError()
+
+ self.assertTrue (expr_error.Fail())
+
+ # Make sure the call produced no NSLog stdout.
+ stdout = process.GetSTDOUT(100)
+ self.assertTrue (stdout is None or (len(stdout) == 0))
+
+ # Make sure the error is helpful:
+ err_string = expr_error.GetCString()
+ self.assertTrue ("selector" in err_string)
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-checker/main.m b/packages/Python/lldbsuite/test/lang/objc/objc-checker/main.m
new file mode 100644
index 000000000000..4a09a2826f70
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-checker/main.m
@@ -0,0 +1,32 @@
+#import <Foundation/Foundation.h>
+
+@interface Simple : NSObject
+{
+ int _value;
+}
+- (int) value;
+- (void) setValue: (int) newValue;
+@end
+
+@implementation Simple
+- (int) value
+{
+ return _value;
+}
+
+- (void) setValue: (int) newValue
+{
+ _value = newValue;
+}
+@end
+
+int main ()
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ Simple *my_simple = [[Simple alloc] init];
+ my_simple.value = 20;
+ // Set a breakpoint here.
+ NSLog (@"Object has value: %d.", my_simple.value);
+ [pool drain];
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-class-method/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-class-method/Makefile
new file mode 100644
index 000000000000..c2d07910a6e8
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-class-method/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := class.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-class-method/TestObjCClassMethod.py b/packages/Python/lldbsuite/test/lang/objc/objc-class-method/TestObjCClassMethod.py
new file mode 100644
index 000000000000..2a978bc9c024
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-class-method/TestObjCClassMethod.py
@@ -0,0 +1,56 @@
+"""Test calling functions in class methods."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestObjCClassMethod(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "class.m"
+ self.break_line = line_number(self.main_source, '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ @expectedFailurei386
+ @add_test_categories(['pyapi'])
+ #rdar://problem/9745789 "expression" can't call functions in class methods
+ def test_with_python_api(self):
+ """Test calling functions in class methods."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ bpt = target.BreakpointCreateByLocation(self.main_source, self.break_line)
+ self.assertTrue(bpt, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, bpt)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ # Now make sure we can call a function in the class method we've stopped in.
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ cmd_value = frame.EvaluateExpression ("(int)[Foo doSomethingWithString:@\"Hello\"]")
+ self.assertTrue (cmd_value.IsValid())
+ self.assertTrue (cmd_value.GetValueAsUnsigned() == 5)
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-class-method/class.m b/packages/Python/lldbsuite/test/lang/objc/objc-class-method/class.m
new file mode 100644
index 000000000000..18a2c2729bea
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-class-method/class.m
@@ -0,0 +1,24 @@
+#import <Foundation/Foundation.h>
+
+@interface Foo : NSObject
++(int) doSomethingWithString: (NSString *) string;
+-(int) doSomethingInstance: (NSString *) string;
+@end
+
+@implementation Foo
++(int) doSomethingWithString: (NSString *) string
+{
+ NSLog (@"String is: %@.", string);
+ return [string length];
+}
+
+-(int) doSomethingInstance: (NSString *)string
+{
+ return [Foo doSomethingWithString:string];
+}
+@end
+
+int main()
+{
+ return 0; // Set breakpoint here.
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/.categories b/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/.categories
new file mode 100644
index 000000000000..9526bab96fbb
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/.categories
@@ -0,0 +1 @@
+dyntype
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/Makefile
new file mode 100644
index 000000000000..dd909afba21b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/Makefile
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+
+include $(LEVEL)/Makefile.rules
+
+LD_EXTRAS = -framework Foundation
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/TestObjCDynamicSBType.py b/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/TestObjCDynamicSBType.py
new file mode 100644
index 000000000000..b9e84541e2df
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/TestObjCDynamicSBType.py
@@ -0,0 +1,62 @@
+"""
+Test that we are able to properly report a usable dynamic type
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+@skipUnlessDarwin
+class ObjCDynamicSBTypeTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # We'll use the test method name as the exe_name.
+ self.exe_name = self.testMethodName
+ # Find the line number to break inside main().
+ self.main_source = "main.m"
+ self.line = line_number(self.main_source, '// Set breakpoint here.')
+
+ @skipIfi386
+ def test_dyn(self):
+ """Test that we are able to properly report a usable dynamic type."""
+ d = {'EXE': self.exe_name}
+ self.build(dictionary=d)
+ self.setTearDownCleanup(dictionary=d)
+
+ exe = os.path.join(os.getcwd(), self.exe_name)
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, self.main_source, self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ v_object = self.frame().FindVariable("object").GetDynamicValue(lldb.eDynamicCanRunTarget)
+ v_base = self.frame().FindVariable("base").GetDynamicValue(lldb.eDynamicCanRunTarget)
+ self.assertTrue(v_object.GetTypeName() == "MyDerivedClass *", "The NSObject is properly type-named")
+ self.assertTrue(v_base.GetTypeName() == "MyDerivedClass *", "The Base is properly type-named")
+ object_type = v_object.GetType()
+ base_type = v_base.GetType()
+ self.assertTrue(object_type.GetName() == "MyDerivedClass *", "The dynamic SBType for NSObject is for the correct type")
+ self.assertTrue(base_type.GetName() == "MyDerivedClass *", "The dynamic SBType for Base is for the correct type")
+ object_pointee_type = object_type.GetPointeeType()
+ base_pointee_type = base_type.GetPointeeType()
+ self.assertTrue(object_pointee_type.GetName() == "MyDerivedClass", "The dynamic type for NSObject figures out its pointee type just fine")
+ self.assertTrue(base_pointee_type.GetName() == "MyDerivedClass", "The dynamic type for Base figures out its pointee type just fine")
+
+ self.assertTrue(object_pointee_type.GetDirectBaseClassAtIndex(0).GetName() == "MyBaseClass", "The dynamic type for NSObject can go back to its base class")
+ self.assertTrue(base_pointee_type.GetDirectBaseClassAtIndex(0).GetName() == "MyBaseClass", "The dynamic type for Base can go back to its base class")
+
+ self.assertTrue(object_pointee_type.GetDirectBaseClassAtIndex(0).GetType().GetDirectBaseClassAtIndex(0).GetName() == "NSObject", "The dynamic type for NSObject can go up the hierarchy")
+ self.assertTrue(base_pointee_type.GetDirectBaseClassAtIndex(0).GetType().GetDirectBaseClassAtIndex(0).GetName() == "NSObject", "The dynamic type for Base can go up the hierarchy")
+
+ self.assertTrue(object_pointee_type.GetNumberOfFields() == 2, "The dynamic type for NSObject has 2 fields")
+ self.assertTrue(base_pointee_type.GetNumberOfFields() == 2, "The dynamic type for Base has 2 fields")
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/main.m b/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/main.m
new file mode 100644
index 000000000000..f3587b52cd5f
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-dyn-sbtype/main.m
@@ -0,0 +1,53 @@
+#import <Foundation/Foundation.h>
+
+@interface MyBaseClass : NSObject
+{}
+-(id) init;
+-(int) getInt;
+@end
+
+@implementation MyBaseClass
+- (id) init {
+ return (self = [super init]);
+}
+
+- (int) getInt {
+ return 1;
+}
+@end
+
+@interface MyDerivedClass : MyBaseClass
+{
+ int x;
+ int y;
+}
+-(id) init;
+-(int) getInt;
+@end
+
+@implementation MyDerivedClass
+- (id) init {
+ self = [super init];
+ if (self) {
+ self-> x = 0;
+ self->y = 1;
+ }
+ return self;
+}
+
+- (int) getInt {
+ y = x++;
+ return x;
+}
+@end
+
+
+int main (int argc, char const *argv[])
+{
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ NSObject* object = [[MyDerivedClass alloc] init];
+ MyBaseClass* base = [[MyDerivedClass alloc] init];
+ [pool release]; // Set breakpoint here.
+ return 0;
+}
+
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/Makefile
new file mode 100644
index 000000000000..a981f4b9035e
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := dynamic-value.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/TestObjCDynamicValue.py b/packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/TestObjCDynamicValue.py
new file mode 100644
index 000000000000..acddfb8bd647
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/TestObjCDynamicValue.py
@@ -0,0 +1,177 @@
+"""
+Use lldb Python API to test dynamic values in ObjC
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class ObjCDynamicValueTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+
+ # Find the line number to break for main.c.
+
+ self.source_name = 'dynamic-value.m'
+ self.set_property_line = line_number(self.source_name, '// This is the line in setProperty, make sure we step to here.')
+ self.handle_SourceBase = line_number(self.source_name,
+ '// Break here to check dynamic values.')
+ self.main_before_setProperty_line = line_number(self.source_name,
+ '// Break here to see if we can step into real method.')
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ @expectedFailureDarwin("llvm.org/pr20271 rdar://18684107")
+ def test_get_objc_dynamic_vals(self):
+ """Test fetching ObjC dynamic values."""
+ if self.getArchitecture() == 'i386':
+ # rdar://problem/9946499
+ self.skipTest("Dynamic types for ObjC V1 runtime not implemented")
+
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target from the debugger.
+
+ target = self.dbg.CreateTarget (exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Set up our breakpoints:
+
+ handle_SourceBase_bkpt = target.BreakpointCreateByLocation(self.source_name, self.handle_SourceBase)
+ self.assertTrue(handle_SourceBase_bkpt and
+ handle_SourceBase_bkpt.GetNumLocations() == 1,
+ VALID_BREAKPOINT)
+
+ main_before_setProperty_bkpt = target.BreakpointCreateByLocation(self.source_name, self.main_before_setProperty_line)
+ self.assertTrue(main_before_setProperty_bkpt and
+ main_before_setProperty_bkpt.GetNumLocations() == 1,
+ VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at the entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process.GetState() == lldb.eStateStopped,
+ PROCESS_STOPPED)
+
+ threads = lldbutil.get_threads_stopped_at_breakpoint (process, main_before_setProperty_bkpt)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+
+ #
+ # At this point, myObserver has a Source pointer that is actually a KVO swizzled SourceDerived
+ # make sure we can get that properly:
+
+ frame = thread.GetFrameAtIndex(0)
+ myObserver = frame.FindVariable('myObserver', lldb.eDynamicCanRunTarget)
+ self.assertTrue (myObserver)
+ myObserver_source = myObserver.GetChildMemberWithName ('_source', lldb.eDynamicCanRunTarget)
+ self.examine_SourceDerived_ptr (myObserver_source)
+
+ #
+ # Make sure a static value can be correctly turned into a dynamic value.
+
+ frame = thread.GetFrameAtIndex(0)
+ myObserver_static = frame.FindVariable('myObserver', lldb.eNoDynamicValues)
+ self.assertTrue (myObserver_static)
+ myObserver = myObserver_static.GetDynamicValue (lldb.eDynamicCanRunTarget)
+ myObserver_source = myObserver.GetChildMemberWithName ('_source', lldb.eDynamicCanRunTarget)
+ self.examine_SourceDerived_ptr (myObserver_source)
+
+ # The "frame var" code uses another path to get into children, so let's
+ # make sure that works as well:
+
+ result = lldb.SBCommandReturnObject()
+
+ self.expect('frame var -d run-target myObserver->_source', 'frame var finds its way into a child member',
+ patterns = ['\(SourceDerived \*\)'])
+
+ # check that our ObjC GetISA() does a good job at hiding KVO swizzled classes
+
+ self.expect('frame var -d run-target myObserver->_source -T', 'the KVO-ed class is hidden',
+ substrs = ['SourceDerived'])
+
+ self.expect('frame var -d run-target myObserver->_source -T', 'the KVO-ed class is hidden', matching = False,
+ substrs = ['NSKVONotify'])
+
+ # This test is not entirely related to the main thrust of this test case, but since we're here,
+ # try stepping into setProperty, and make sure we get into the version in Source:
+
+ thread.StepInto()
+
+ threads = lldbutil.get_stopped_threads (process, lldb.eStopReasonPlanComplete)
+ self.assertTrue (len(threads) == 1)
+ line_entry = threads[0].GetFrameAtIndex(0).GetLineEntry()
+
+ self.assertEqual (line_entry.GetLine(), self.set_property_line)
+ self.assertEqual (line_entry.GetFileSpec().GetFilename(), self.source_name)
+
+ # Okay, back to the main business. Continue to the handle_SourceBase and make sure we get the correct dynamic value.
+
+ threads = lldbutil.continue_to_breakpoint (process, handle_SourceBase_bkpt)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+
+ frame = thread.GetFrameAtIndex(0)
+
+ # Get "object" using FindVariable:
+
+ noDynamic = lldb.eNoDynamicValues
+ useDynamic = lldb.eDynamicCanRunTarget
+
+ object_static = frame.FindVariable ('object', noDynamic)
+ object_dynamic = frame.FindVariable ('object', useDynamic)
+
+ # Delete this object to make sure that this doesn't cause havoc with the dynamic object that depends on it.
+ del (object_static)
+
+ self.examine_SourceDerived_ptr (object_dynamic)
+
+ # Get "this" using FindValue, make sure that works too:
+ object_static = frame.FindValue ('object', lldb.eValueTypeVariableArgument, noDynamic)
+ object_dynamic = frame.FindValue ('object', lldb.eValueTypeVariableArgument, useDynamic)
+ del (object_static)
+ self.examine_SourceDerived_ptr (object_dynamic)
+
+ # Get "this" using the EvaluateExpression:
+ object_static = frame.EvaluateExpression ('object', noDynamic)
+ object_dynamic = frame.EvaluateExpression ('object', useDynamic)
+ del (object_static)
+ self.examine_SourceDerived_ptr (object_dynamic)
+
+ # Continue again to the handle_SourceBase and make sure we get the correct dynamic value.
+ # This one looks exactly the same, but in fact this is an "un-KVO'ed" version of SourceBase, so
+ # its isa pointer points to SourceBase not NSKVOSourceBase or whatever...
+
+ threads = lldbutil.continue_to_breakpoint (process, handle_SourceBase_bkpt)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+
+ frame = thread.GetFrameAtIndex(0)
+
+ # Get "object" using FindVariable:
+
+ object_static = frame.FindVariable ('object', noDynamic)
+ object_dynamic = frame.FindVariable ('object', useDynamic)
+
+ # Delete this object to make sure that this doesn't cause havoc with the dynamic object that depends on it.
+ del (object_static)
+
+ self.examine_SourceDerived_ptr (object_dynamic)
+
+ def examine_SourceDerived_ptr (self, object):
+ self.assertTrue (object)
+ self.assertTrue (object.GetTypeName().find ('SourceDerived') != -1)
+ derivedValue = object.GetChildMemberWithName ('_derivedValue')
+ self.assertTrue (derivedValue)
+ self.assertTrue (int (derivedValue.GetValue(), 0) == 30)
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/dynamic-value.m b/packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/dynamic-value.m
new file mode 100644
index 000000000000..2bcb76b1d9dc
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-dynamic-value/dynamic-value.m
@@ -0,0 +1,147 @@
+#import <Foundation/Foundation.h>
+
+// SourceBase will be the base class of Source. We'll pass a Source object into a
+// function as a SourceBase, and then see if the dynamic typing can get us through the KVO
+// goo and all the way back to Source.
+
+@interface SourceBase: NSObject
+{
+ uint32_t _value;
+}
+- (SourceBase *) init;
+- (uint32_t) getValue;
+@end
+
+@implementation SourceBase
+- (SourceBase *) init
+{
+ [super init];
+ _value = 10;
+ return self;
+}
+- (uint32_t) getValue
+{
+ return _value;
+}
+@end
+
+// Source is a class that will be observed by the Observer class below.
+// When Observer sets itself up to observe this property (in initWithASource)
+// the KVO system will overwrite the "isa" pointer of the object with the "kvo'ed"
+// one.
+
+@interface Source : SourceBase
+{
+ int _property;
+}
+- (Source *) init;
+- (void) setProperty: (int) newValue;
+@end
+
+@implementation Source
+- (Source *) init
+{
+ [super init];
+ _property = 20;
+ return self;
+}
+- (void) setProperty: (int) newValue
+{
+ _property = newValue; // This is the line in setProperty, make sure we step to here.
+}
+@end
+
+@interface SourceDerived : Source
+{
+ int _derivedValue;
+}
+- (SourceDerived *) init;
+- (uint32_t) getValue;
+@end
+
+@implementation SourceDerived
+- (SourceDerived *) init
+{
+ [super init];
+ _derivedValue = 30;
+ return self;
+}
+- (uint32_t) getValue
+{
+ return _derivedValue;
+}
+@end
+
+// Observer is the object that will watch Source and cause KVO to swizzle it...
+
+@interface Observer : NSObject
+{
+ Source *_source;
+}
++ (Observer *) observerWithSource: (Source *) source;
+- (Observer *) initWithASource: (Source *) source;
+- (void) observeValueForKeyPath: (NSString *) path
+ ofObject: (id) object
+ change: (NSDictionary *) change
+ context: (void *) context;
+@end
+
+@implementation Observer
+
++ (Observer *) observerWithSource: (Source *) inSource;
+{
+ Observer *retval;
+
+ retval = [[Observer alloc] initWithASource: inSource];
+ return retval;
+}
+
+- (Observer *) initWithASource: (Source *) source
+{
+ [super init];
+ _source = source;
+ [_source addObserver: self
+ forKeyPath: @"property"
+ options: (NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
+ context: NULL];
+ return self;
+}
+
+- (void) observeValueForKeyPath: (NSString *) path
+ ofObject: (id) object
+ change: (NSDictionary *) change
+ context: (void *) context
+{
+ printf ("Observer function called.\n");
+ return;
+}
+@end
+
+uint32_t
+handle_SourceBase (SourceBase *object)
+{
+ return [object getValue]; // Break here to check dynamic values.
+}
+
+int main ()
+{
+ Source *mySource;
+ Observer *myObserver;
+
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+
+ mySource = [[SourceDerived alloc] init];
+ myObserver = [Observer observerWithSource: mySource];
+
+ [mySource setProperty: 5]; // Break here to see if we can step into real method.
+
+ uint32_t return_value = handle_SourceBase (mySource);
+
+ SourceDerived *unwatchedSource = [[SourceDerived alloc] init];
+
+ return_value = handle_SourceBase (unwatchedSource);
+
+ [pool release];
+ return 0;
+
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/Makefile
new file mode 100644
index 000000000000..fdd3b5ebfa9e
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := objc-ivar-offsets.m main.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/TestObjCIvarOffsets.py b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/TestObjCIvarOffsets.py
new file mode 100644
index 000000000000..6be1d379c8eb
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/TestObjCIvarOffsets.py
@@ -0,0 +1,74 @@
+"""Test printing ObjC objects that use unbacked properties - so that the static ivar offsets are incorrect."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TestObjCIvarOffsets(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "main.m"
+ self.stop_line = line_number(self.main_source, '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ def test_with_python_api(self):
+ """Test printing ObjC objects that use unbacked properties"""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ breakpoint = target.BreakpointCreateByLocation(self.main_source, self.stop_line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue (process, "Created a process.")
+ self.assertTrue (process.GetState() == lldb.eStateStopped, "Stopped it too.")
+
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, breakpoint)
+ self.assertTrue (len(thread_list) == 1)
+ thread = thread_list[0]
+
+ frame = thread.GetFrameAtIndex(0)
+ self.assertTrue (frame, "frame 0 is valid")
+
+ mine = thread.GetFrameAtIndex(0).FindVariable("mine")
+ self.assertTrue(mine, "Found local variable mine.")
+
+ # Test the value object value for BaseClass->_backed_int
+
+ error = lldb.SBError()
+
+ mine_backed_int = mine.GetChildMemberWithName ("_backed_int")
+ self.assertTrue(mine_backed_int, "Found mine->backed_int local variable.")
+ backed_value = mine_backed_int.GetValueAsSigned (error)
+ self.assertTrue (error.Success())
+ self.assertTrue (backed_value == 1111)
+
+ # Test the value object value for DerivedClass->_derived_backed_int
+
+ mine_derived_backed_int = mine.GetChildMemberWithName ("_derived_backed_int")
+ self.assertTrue(mine_derived_backed_int, "Found mine->derived_backed_int local variable.")
+ derived_backed_value = mine_derived_backed_int.GetValueAsSigned (error)
+ self.assertTrue (error.Success())
+ self.assertTrue (derived_backed_value == 3333)
+
+ # Make sure we also get bit-field offsets correct:
+
+ mine_flag2 = mine.GetChildMemberWithName ("flag2")
+ self.assertTrue(mine_flag2, "Found mine->flag2 local variable.")
+ flag2_value = mine_flag2.GetValueAsUnsigned (error)
+ self.assertTrue (error.Success())
+ self.assertTrue (flag2_value == 7)
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/main.m b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/main.m
new file mode 100644
index 000000000000..41943f48aef5
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/main.m
@@ -0,0 +1,15 @@
+#include "objc-ivar-offsets.h"
+
+int
+main ()
+{
+ DerivedClass *mine = [[DerivedClass alloc] init];
+ mine.backed_int = 1111;
+ mine.unbacked_int = 2222;
+ mine.derived_backed_int = 3333;
+ mine.derived_unbacked_int = 4444;
+ mine->flag1 = 1;
+ mine->flag2 = 7;
+
+ return 0; // Set breakpoint here.
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/objc-ivar-offsets.h b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/objc-ivar-offsets.h
new file mode 100644
index 000000000000..99bbd427b064
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/objc-ivar-offsets.h
@@ -0,0 +1,27 @@
+#import <Foundation/Foundation.h>
+
+@interface BaseClass : NSObject
+{
+ int _backed_int;
+#if !__OBJC2__
+ int _unbacked_int;
+#endif
+}
+@property int backed_int;
+@property int unbacked_int;
+@end
+
+@interface DerivedClass : BaseClass
+{
+ int _derived_backed_int;
+#if !__OBJC2__
+ int _derived_unbacked_int;
+#endif
+ @public
+ uint32_t flag1 : 1;
+ uint32_t flag2 : 3;
+}
+
+@property int derived_backed_int;
+@property int derived_unbacked_int;
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/objc-ivar-offsets.m b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/objc-ivar-offsets.m
new file mode 100644
index 000000000000..db87adea3d13
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-offsets/objc-ivar-offsets.m
@@ -0,0 +1,19 @@
+#import "objc-ivar-offsets.h"
+
+@implementation BaseClass
+@synthesize backed_int = _backed_int;
+#if __OBJC2__
+@synthesize unbacked_int;
+#else
+@synthesize unbacked_int = _unbacked_int;
+#endif
+@end
+
+@implementation DerivedClass
+@synthesize derived_backed_int = _derived_backed_int;
+#if __OBJC2__
+@synthesize derived_unbacked_int;
+#else
+@synthesize derived_unbacked_int = _derived_unbacked_int;
+#endif
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-ivar-protocols/TestIvarProtocols.py b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-protocols/TestIvarProtocols.py
new file mode 100644
index 000000000000..80305e303d03
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-protocols/TestIvarProtocols.py
@@ -0,0 +1,4 @@
+import lldbsuite.test.lldbinline as lldbinline
+import lldbsuite.test.lldbtest as lldbtest
+
+lldbinline.MakeInlineTest(__file__, globals(), [lldbtest.skipIfFreeBSD,lldbtest.skipIfLinux,lldbtest.skipIfWindows])
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-ivar-protocols/main.m b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-protocols/main.m
new file mode 100644
index 000000000000..aa6c4715c33b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-protocols/main.m
@@ -0,0 +1,33 @@
+#import <Foundation/Foundation.h>
+
+@protocol MyProtocol
+-(void)aMethod;
+@end
+
+@interface MyClass : NSObject {
+ id <MyProtocol> myId;
+ NSObject <MyProtocol> *myObject;
+};
+
+-(void)doSomething;
+
+@end
+
+@implementation MyClass
+
+-(void)doSomething
+{
+ NSLog(@"Hello"); //% self.expect("expression -- myId", DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ["id"]);
+ //% self.expect("expression -- myObject", DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ["NSObject"]);
+}
+
+@end
+
+int main ()
+{
+ @autoreleasepool
+ {
+ MyClass *c = [MyClass alloc];
+ [c doSomething];
+ }
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/Makefile
new file mode 100644
index 000000000000..4365ed9ae936
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/Makefile
@@ -0,0 +1,15 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+default: a.out.stripped
+
+a.out.stripped: a.out.dSYM
+ strip -o a.out.stripped a.out
+
+clean::
+ rm -f a.out.stripped
+ rm -rf a.out.stripped.dSYM
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/TestObjCIvarStripped.py b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/TestObjCIvarStripped.py
new file mode 100644
index 000000000000..78c7123eefca
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/TestObjCIvarStripped.py
@@ -0,0 +1,59 @@
+"""Test printing ObjC objects that use unbacked properties - so that the static ivar offsets are incorrect."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TestObjCIvarStripped(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "main.m"
+ self.stop_line = line_number(self.main_source, '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ @skipIfDwarf # This test requires a stripped binary and a dSYM
+ @skipIfDWO # This test requires a stripped binary and a dSYM
+ @add_test_categories(['pyapi'])
+ def test_with_python_api(self):
+ """Test that we can find stripped Objective-C ivars in the runtime"""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out.stripped")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ self.dbg.HandleCommand("add-dsym a.out.dSYM")
+
+ breakpoint = target.BreakpointCreateByLocation(self.main_source, self.stop_line)
+ self.assertTrue(breakpoint.IsValid() and breakpoint.GetNumLocations() > 0, VALID_BREAKPOINT)
+
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+ self.assertTrue (process, "Created a process.")
+ self.assertTrue (process.GetState() == lldb.eStateStopped, "Stopped it too.")
+
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, breakpoint)
+ self.assertTrue (len(thread_list) == 1)
+ thread = thread_list[0]
+
+ frame = thread.GetFrameAtIndex(0)
+ self.assertTrue (frame, "frame 0 is valid")
+
+ # Test the expression for mc->_foo
+
+ error = lldb.SBError()
+
+ ivar = frame.EvaluateExpression ("(mc->_foo)")
+ self.assertTrue(ivar, "Got result for mc->_foo")
+ ivar_value = ivar.GetValueAsSigned (error)
+ self.assertTrue (error.Success())
+ self.assertTrue (ivar_value == 3)
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/main.m b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/main.m
new file mode 100644
index 000000000000..ed9c1d9ec426
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-ivar-stripped/main.m
@@ -0,0 +1,33 @@
+#import <Foundation/Foundation.h>
+
+@interface MyClass : NSObject {
+@public
+ int _foo;
+};
+
+-(id)init;
+@end
+
+@implementation MyClass
+
+-(id)init
+{
+ if ([super init])
+ {
+ _foo = 3;
+ }
+
+ return self;
+}
+
+@end
+
+int main ()
+{
+ @autoreleasepool
+ {
+ MyClass *mc = [[MyClass alloc] init];
+
+ NSLog(@"%d", mc->_foo); // Set breakpoint here.
+ }
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/Makefile
new file mode 100644
index 000000000000..ad3cb3fadcde
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/Makefile
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+
+include $(LEVEL)/Makefile.rules
+
+LDFLAGS += -framework Foundation
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/TestObjCNewSyntax.py b/packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/TestObjCNewSyntax.py
new file mode 100644
index 000000000000..ca77de261829
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/TestObjCNewSyntax.py
@@ -0,0 +1,103 @@
+"""Test that the Objective-C syntax for dictionary/array literals and indexing works"""
+
+from __future__ import print_function
+
+
+
+import unittest2
+import os, time
+import lldb
+import platform
+import lldbsuite.test.lldbutil as lldbutil
+
+from distutils.version import StrictVersion
+
+from lldbsuite.test.lldbtest import *
+
+class ObjCNewSyntaxTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line number to break inside main().
+ self.line = line_number('main.m', '// Set breakpoint 0 here.')
+
+ @skipUnlessDarwin
+ @expectedFailureAll(oslist=['macosx'], compiler='clang', compiler_version=['<', '7.0.0'])
+ @unittest2.skipIf(platform.system() != "Darwin" or StrictVersion('12.0.0') > platform.release(), "Only supported on Darwin 12.0.0+")
+ def test_expr(self):
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # The breakpoint should have a hit count of 1.
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ self.expect("expr --object-description -- immutable_array[0]", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["foo"])
+
+ self.expect("expr --object-description -- mutable_array[0]", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["foo"])
+
+ self.expect("expr --object-description -- mutable_array[0] = @\"bar\"", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["bar"])
+
+ self.expect("expr --object-description -- mutable_array[0]", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["bar"])
+
+ self.expect("expr --object-description -- immutable_dictionary[@\"key\"]", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["value"])
+
+ self.expect("expr --object-description -- mutable_dictionary[@\"key\"]", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["value"])
+
+ self.expect("expr --object-description -- mutable_dictionary[@\"key\"] = @\"object\"", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["object"])
+
+ self.expect("expr --object-description -- mutable_dictionary[@\"key\"]", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["object"])
+
+ self.expect("expr --object-description -- @[ @\"foo\", @\"bar\" ]", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["NSArray", "foo", "bar"])
+
+ self.expect("expr --object-description -- @{ @\"key\" : @\"object\" }", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["key", "object"])
+
+ self.expect("expr --object-description -- @'a'", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = [str(ord('a'))])
+
+ self.expect("expr --object-description -- @1", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["1"])
+
+ self.expect("expr --object-description -- @1l", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["1"])
+
+ self.expect("expr --object-description -- @1ul", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["1"])
+
+ self.expect("expr --object-description -- @1ll", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["1"])
+
+ self.expect("expr --object-description -- @1ull", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["1"])
+
+ self.expect("expr -- @123.45", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["NSNumber", "123.45"])
+
+ self.expect("expr --object-description -- @( 1 + 3 )", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["4"])
+ self.expect("expr -- @((char*)\"Hello world\" + 6)", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["NSString", "world"])
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/main.m b/packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/main.m
new file mode 100644
index 000000000000..d77ba5b10de9
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-new-syntax/main.m
@@ -0,0 +1,21 @@
+#import <Foundation/Foundation.h>
+
+int main()
+{
+ @autoreleasepool
+ {
+ // NSArrays
+ NSArray *immutable_array = @[ @"foo", @"bar" ];
+ NSMutableArray *mutable_array = [NSMutableArray arrayWithCapacity:2];
+ [mutable_array addObjectsFromArray:immutable_array];
+
+ // NSDictionaries
+ NSDictionary *immutable_dictionary = @{ @"key" : @"value" };
+ NSMutableDictionary *mutable_dictionary = [NSMutableDictionary dictionaryWithCapacity:1];
+ [mutable_dictionary addEntriesFromDictionary:immutable_dictionary];
+
+ NSNumber *one = @1;
+
+ NSLog(@"Stop here"); // Set breakpoint 0 here.
+ }
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-optimized/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-optimized/Makefile
new file mode 100644
index 000000000000..aa6a7520525e
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-optimized/Makefile
@@ -0,0 +1,8 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+
+CFLAGS ?= -arch $(ARCH) -g -O2
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-optimized/TestObjcOptimized.py b/packages/Python/lldbsuite/test/lang/objc/objc-optimized/TestObjcOptimized.py
new file mode 100644
index 000000000000..a4a202e3f940
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-optimized/TestObjcOptimized.py
@@ -0,0 +1,63 @@
+"""
+Test that objective-c expression parser continues to work for optimized build.
+
+http://llvm.org/viewvc/llvm-project?rev=126973&view=rev
+Fixed a bug in the expression parser where the 'this'
+or 'self' variable was not properly read if the compiler
+optimized it into a register.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+import re
+
+# rdar://problem/9087739
+# test failure: objc_optimized does not work for "-C clang -A i386"
+@skipUnlessDarwin
+class ObjcOptimizedTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+ myclass = "MyClass"
+ mymethod = "description"
+ method_spec = "-[%s %s]" % (myclass, mymethod)
+
+ def test_break(self):
+ """Test 'expr member' continues to work for optimized build."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_symbol (self, self.method_spec, num_expected_locations=1, sym_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+ self.expect("thread backtrace", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ["stop reason = breakpoint"],
+ patterns = ["frame.*0:.*%s %s" % (self.myclass, self.mymethod)])
+
+ self.expect('expression member',
+ startstr = "(int) $0 = 5")
+
+ # <rdar://problem/12693963>
+ interp = self.dbg.GetCommandInterpreter()
+ result = lldb.SBCommandReturnObject()
+ interp.HandleCommand('frame variable self', result)
+ output = result.GetOutput()
+
+ desired_pointer = "0x0"
+
+ mo = re.search("0x[0-9a-f]+", output)
+
+ if mo:
+ desired_pointer = mo.group(0)
+
+ self.expect('expression (self)',
+ substrs = [("(%s *) $1 = " % self.myclass), desired_pointer])
+
+ self.expect('expression self->non_member', error=True,
+ substrs = ["does not have a member named 'non_member'"])
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-optimized/main.m b/packages/Python/lldbsuite/test/lang/objc/objc-optimized/main.m
new file mode 100644
index 000000000000..df88eea0f86a
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-optimized/main.m
@@ -0,0 +1,44 @@
+#import <Foundation/Foundation.h>
+
+@interface MyClass : NSObject {
+ int member;
+}
+
+- (id)initWithMember:(int)_member;
+- (NSString*)description;
+@end
+
+@implementation MyClass
+
+- (id)initWithMember:(int)_member
+{
+ if (self = [super init])
+ {
+ member = _member;
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ [super dealloc];
+}
+
+// Set a breakpoint on '-[MyClass description]' and test expressions: expr member
+- (NSString *)description
+{
+ return [NSString stringWithFormat:@"%d", member];
+}
+@end
+
+int main (int argc, char const *argv[])
+{
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+
+ MyClass *my_object = [[MyClass alloc] initWithMember:5];
+
+ NSLog(@"MyObject %@", [my_object description]);
+
+ [pool release];
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-property/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-property/Makefile
new file mode 100644
index 000000000000..a1608fe5a664
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-property/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-property/TestObjCProperty.py b/packages/Python/lldbsuite/test/lang/objc/objc-property/TestObjCProperty.py
new file mode 100644
index 000000000000..c22a1f1ad532
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-property/TestObjCProperty.py
@@ -0,0 +1,114 @@
+"""
+Use lldb Python API to verify that expression evaluation for property references uses the correct getters and setters
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import re
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class ObjCPropertyTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+
+ # Find the line number to break for main.c.
+ self.source_name = 'main.m'
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ def test_objc_properties(self):
+ """Test that expr uses the correct property getters and setters"""
+ if self.getArchitecture() == 'i386':
+ self.skipTest("requires modern objc runtime")
+
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ # Create a target from the debugger.
+
+ target = self.dbg.CreateTarget (exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ # Set up our breakpoints:
+
+ main_bkpt = target.BreakpointCreateBySourceRegex ("Set a breakpoint here.", lldb.SBFileSpec (self.source_name))
+ self.assertTrue(main_bkpt and
+ main_bkpt.GetNumLocations() == 1,
+ VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at the entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process.GetState() == lldb.eStateStopped,
+ PROCESS_STOPPED)
+
+ threads = lldbutil.get_threads_stopped_at_breakpoint (process, main_bkpt)
+ self.assertTrue (len(threads) == 1)
+ thread = threads[0]
+ frame = thread.GetFrameAtIndex(0)
+
+ mine = frame.FindVariable ("mine")
+ self.assertTrue (mine.IsValid())
+ access_count = mine.GetChildMemberWithName ("_access_count")
+ self.assertTrue (access_count.IsValid())
+ start_access_count = access_count.GetValueAsUnsigned (123456)
+ self.assertTrue (start_access_count != 123456)
+
+ #
+ # The first set of tests test calling the getter & setter of
+ # a property that actually only has a getter & setter and no
+ # @property.
+ #
+ nonexistant_value = frame.EvaluateExpression("mine.nonexistantInt", False)
+ nonexistant_error = nonexistant_value.GetError()
+ self.assertTrue (nonexistant_error.Success())
+ nonexistant_int = nonexistant_value.GetValueAsUnsigned (123456)
+ self.assertTrue (nonexistant_int == 6)
+
+ # Calling the getter function would up the access count, so make sure that happened.
+
+ new_access_count = access_count.GetValueAsUnsigned (123456)
+ self.assertTrue (new_access_count - start_access_count == 1)
+ start_access_count = new_access_count
+
+ #
+ # Now call the setter, then make sure that
+ nonexistant_change = frame.EvaluateExpression("mine.nonexistantInt = 10", False)
+ nonexistant_error = nonexistant_change.GetError()
+ self.assertTrue (nonexistant_error.Success())
+
+ # Calling the setter function would up the access count, so make sure that happened.
+
+ new_access_count = access_count.GetValueAsUnsigned (123456)
+ self.assertTrue (new_access_count - start_access_count == 1)
+ start_access_count = new_access_count
+
+ #
+ # Now we call the getter of a property that is backed by an ivar,
+ # make sure it works and that we actually update the backing ivar.
+ #
+
+ backed_value = frame.EvaluateExpression("mine.backedInt", False)
+ backed_error = backed_value.GetError()
+ self.assertTrue (backed_error.Success())
+ backing_value = mine.GetChildMemberWithName ("_backedInt")
+ self.assertTrue (backing_value.IsValid())
+ self.assertTrue (backed_value.GetValueAsUnsigned (12345) == backing_value.GetValueAsUnsigned(23456))
+
+ unbacked_value = frame.EvaluateExpression("mine.unbackedInt", False)
+ unbacked_error = unbacked_value.GetError()
+ self.assertTrue (unbacked_error.Success())
+
+ idWithProtocol_value = frame.EvaluateExpression("mine.idWithProtocol", False)
+ idWithProtocol_error = idWithProtocol_value.GetError()
+ self.assertTrue (idWithProtocol_error.Success())
+ self.assertTrue (idWithProtocol_value.GetTypeName() == "id")
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-property/main.m b/packages/Python/lldbsuite/test/lang/objc/objc-property/main.m
new file mode 100644
index 000000000000..2ef142be9b00
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-property/main.m
@@ -0,0 +1,100 @@
+#import <Foundation/Foundation.h>
+
+@protocol MyProtocol
+
+-(const char *)hello;
+
+@end
+
+@interface BaseClass : NSObject
+{
+ int _backedInt;
+ int _access_count;
+}
+
+- (int) nonexistantInt;
+- (void) setNonexistantInt: (int) in_int;
+
+- (int) myGetUnbackedInt;
+- (void) mySetUnbackedInt: (int) in_int;
+
+- (int) getAccessCount;
+
++(BaseClass *) baseClassWithBackedInt: (int) inInt andUnbackedInt: (int) inOtherInt;
+
+@property(getter=myGetUnbackedInt,setter=mySetUnbackedInt:) int unbackedInt;
+@property int backedInt;
+@property (nonatomic, assign) id <MyProtocol> idWithProtocol;
+@end
+
+@implementation BaseClass
+@synthesize unbackedInt;
+@synthesize backedInt = _backedInt;
+
++ (BaseClass *) baseClassWithBackedInt: (int) inInt andUnbackedInt: (int) inOtherInt
+{
+ BaseClass *new = [[BaseClass alloc] init];
+
+ new->_backedInt = inInt;
+ new->unbackedInt = inOtherInt;
+
+ return new;
+}
+
+- (int) myGetUnbackedInt
+{
+ // NSLog (@"Getting BaseClass::unbackedInt - %d.\n", unbackedInt);
+ _access_count++;
+ return unbackedInt;
+}
+
+- (void) mySetUnbackedInt: (int) in_int
+{
+ // NSLog (@"Setting BaseClass::unbackedInt from %d to %d.", unbackedInt, in_int);
+ _access_count++;
+ unbackedInt = in_int;
+}
+
+- (int) nonexistantInt
+{
+ // NSLog (@"Getting BaseClass::nonexistantInt - %d.\n", 5);
+ _access_count++;
+ return 6;
+}
+
+- (void) setNonexistantInt: (int) in_int
+{
+ // NSLog (@"Setting BaseClass::nonexistantInt from 7 to %d.", in_int);
+ _access_count++;
+}
+
+- (int) getAccessCount
+{
+ return _access_count;
+}
+@end
+
+int
+main ()
+{
+ BaseClass *mine = [BaseClass baseClassWithBackedInt: 10 andUnbackedInt: 20];
+
+ // Set a breakpoint here.
+ int nonexistant = mine.nonexistantInt;
+
+ int backedInt = mine.backedInt;
+
+ int unbackedInt = mine.unbackedInt;
+
+ id idWithProtocol = mine.idWithProtocol;
+
+ NSLog (@"Results for %p: nonexistant: %d backed: %d unbacked: %d accessCount: %d.",
+ mine,
+ nonexistant,
+ backedInt,
+ unbackedInt,
+ [mine getAccessCount]);
+ return 0;
+
+}
+
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/Makefile
new file mode 100644
index 000000000000..a1608fe5a664
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/TestRuntimeIvars.py b/packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/TestRuntimeIvars.py
new file mode 100644
index 000000000000..80305e303d03
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/TestRuntimeIvars.py
@@ -0,0 +1,4 @@
+import lldbsuite.test.lldbinline as lldbinline
+import lldbsuite.test.lldbtest as lldbtest
+
+lldbinline.MakeInlineTest(__file__, globals(), [lldbtest.skipIfFreeBSD,lldbtest.skipIfLinux,lldbtest.skipIfWindows])
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/main.m b/packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/main.m
new file mode 100644
index 000000000000..1f5a9b077e27
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-runtime-ivars/main.m
@@ -0,0 +1,10 @@
+#import <Foundation/Foundation.h>
+
+int main ()
+{
+ @autoreleasepool
+ {
+ NSLog(@"Hello"); //% self.expect("expression -- *((NSConcretePointerArray*)[NSPointerArray strongObjectsPointerArray])", DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ["count", "capacity", "options", "mutations"]);
+ //% self.expect("expression -- ((NSConcretePointerArray*)[NSPointerArray strongObjectsPointerArray])->count", DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ["unsigned"]);
+ }
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/Makefile
new file mode 100644
index 000000000000..81e7f12dea2b
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/Makefile
@@ -0,0 +1,15 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := static.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+default: a.out.stripped
+
+a.out.stripped: a.out.dSYM
+ strip -o a.out.stripped a.out
+
+clean::
+ rm -f a.out.stripped
+ rm -rf a.out.stripped.dSYM
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/TestObjCStaticMethodStripped.py b/packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/TestObjCStaticMethodStripped.py
new file mode 100644
index 000000000000..4bcc10b8b882
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/TestObjCStaticMethodStripped.py
@@ -0,0 +1,65 @@
+"""Test calling functions in static methods with a stripped binary."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestObjCStaticMethodStripped(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "static.m"
+ self.break_line = line_number(self.main_source, '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ @skipIfDwarf # This test requires a stripped binary and a dSYM
+ @skipIfDWO # This test requires a stripped binary and a dSYM
+ #<rdar://problem/12042992>
+ def test_with_python_api(self):
+ """Test calling functions in static methods with a stripped binary."""
+ if self.getArchitecture() == 'i386':
+ self.skipTest("requires modern objc runtime")
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out.stripped")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ bpt = target.BreakpointCreateByLocation(self.main_source, self.break_line)
+ self.assertTrue(bpt, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, bpt)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ # Now make sure we can call a function in the static method we've stopped in.
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ cmd_value = frame.EvaluateExpression ("(char *) sel_getName (_cmd)")
+ self.assertTrue (cmd_value.IsValid())
+ sel_name = cmd_value.GetSummary()
+ self.assertTrue (sel_name == "\"doSomethingWithString:\"", "Got the right value for the selector as string.")
+
+ cmd_value = frame.EvaluateExpression ("[Foo doSomethingElseWithString:string]")
+ self.assertTrue (cmd_value.IsValid())
+ string_length = cmd_value.GetValueAsUnsigned()
+ self.assertTrue (string_length == 27, "Got the right value from another class method on the same class.")
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/static.m b/packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/static.m
new file mode 100644
index 000000000000..ec7b2ef67195
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-static-method-stripped/static.m
@@ -0,0 +1,29 @@
+#import <Foundation/Foundation.h>
+
+@interface Foo : NSObject
++(void) doSomethingWithString: (NSString *) string;
+-(void) doSomethingWithNothing;
+@end
+
+@implementation Foo
++(void) doSomethingWithString: (NSString *) string
+{
+ NSLog (@"String is: %@.", string); // Set breakpoint here.
+}
+
++(int) doSomethingElseWithString: (NSString *) string
+{
+ NSLog (@"String is still: %@.", string);
+ return [string length];
+}
+
+-(void) doSomethingWithNothing
+{
+}
+@end
+
+int main()
+{
+ [Foo doSomethingWithString: @"Some string I have in mind."];
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-static-method/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-static-method/Makefile
new file mode 100644
index 000000000000..a8e973f6d3b1
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-static-method/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := static.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-static-method/TestObjCStaticMethod.py b/packages/Python/lldbsuite/test/lang/objc/objc-static-method/TestObjCStaticMethod.py
new file mode 100644
index 000000000000..89ef1e7b6898
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-static-method/TestObjCStaticMethod.py
@@ -0,0 +1,61 @@
+"""Test calling functions in static methods."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestObjCStaticMethod(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "static.m"
+ self.break_line = line_number(self.main_source, '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ #<rdar://problem/9745789> "expression" can't call functions in class methods
+ def test_with_python_api(self):
+ """Test calling functions in static methods."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ bpt = target.BreakpointCreateByLocation(self.main_source, self.break_line)
+ self.assertTrue(bpt, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, bpt)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ # Now make sure we can call a function in the static method we've stopped in.
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ cmd_value = frame.EvaluateExpression ("(char *) sel_getName (_cmd)")
+ self.assertTrue (cmd_value.IsValid())
+ sel_name = cmd_value.GetSummary()
+ self.assertTrue (sel_name == "\"doSomethingWithString:\"", "Got the right value for the selector as string.")
+
+ cmd_value = frame.EvaluateExpression ("[self doSomethingElseWithString:string]")
+ self.assertTrue (cmd_value.IsValid())
+ string_length = cmd_value.GetValueAsUnsigned()
+ self.assertTrue (string_length == 27, "Got the right value from another class method on the same class.")
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-static-method/static.m b/packages/Python/lldbsuite/test/lang/objc/objc-static-method/static.m
new file mode 100644
index 000000000000..ec7b2ef67195
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-static-method/static.m
@@ -0,0 +1,29 @@
+#import <Foundation/Foundation.h>
+
+@interface Foo : NSObject
++(void) doSomethingWithString: (NSString *) string;
+-(void) doSomethingWithNothing;
+@end
+
+@implementation Foo
++(void) doSomethingWithString: (NSString *) string
+{
+ NSLog (@"String is: %@.", string); // Set breakpoint here.
+}
+
++(int) doSomethingElseWithString: (NSString *) string
+{
+ NSLog (@"String is still: %@.", string);
+ return [string length];
+}
+
+-(void) doSomethingWithNothing
+{
+}
+@end
+
+int main()
+{
+ [Foo doSomethingWithString: @"Some string I have in mind."];
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-stepping/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-stepping/Makefile
new file mode 100644
index 000000000000..b097fe65fce7
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-stepping/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := stepping-tests.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-stepping/TestObjCStepping.py b/packages/Python/lldbsuite/test/lang/objc/objc-stepping/TestObjCStepping.py
new file mode 100644
index 000000000000..1df416d45133
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-stepping/TestObjCStepping.py
@@ -0,0 +1,172 @@
+"""Test stepping through ObjC method dispatch in various forms."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestObjCStepping(TestBase):
+
+ def getCategories (self):
+ return ['basic_process']
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers that we will step to in main:
+ self.main_source = "stepping-tests.m"
+ self.source_randomMethod_line = line_number (self.main_source, '// Source randomMethod start line.')
+ self.sourceBase_randomMethod_line = line_number (self.main_source, '// SourceBase randomMethod start line.')
+ self.source_returnsStruct_start_line = line_number (self.main_source, '// Source returnsStruct start line.')
+ self.sourceBase_returnsStruct_start_line = line_number (self.main_source, '// SourceBase returnsStruct start line.')
+ self.stepped_past_nil_line = line_number (self.main_source, '// Step over nil should stop here.')
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ def test_with_python_api(self):
+ """Test stepping through ObjC method dispatch in various forms."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ self.main_source_spec = lldb.SBFileSpec (self.main_source)
+
+ breakpoints_to_disable = []
+
+ break1 = target.BreakpointCreateBySourceRegex ("// Set first breakpoint here.", self.main_source_spec)
+ self.assertTrue(break1, VALID_BREAKPOINT)
+ breakpoints_to_disable.append (break1)
+
+ break2 = target.BreakpointCreateBySourceRegex ("// Set second breakpoint here.", self.main_source_spec)
+ self.assertTrue(break2, VALID_BREAKPOINT)
+ breakpoints_to_disable.append (break2)
+
+ break3 = target.BreakpointCreateBySourceRegex ('// Set third breakpoint here.', self.main_source_spec)
+ self.assertTrue(break3, VALID_BREAKPOINT)
+ breakpoints_to_disable.append (break3)
+
+ break4 = target.BreakpointCreateBySourceRegex ('// Set fourth breakpoint here.', self.main_source_spec)
+ self.assertTrue(break4, VALID_BREAKPOINT)
+ breakpoints_to_disable.append (break4)
+
+ break5 = target.BreakpointCreateBySourceRegex ('// Set fifth breakpoint here.', self.main_source_spec)
+ self.assertTrue(break5, VALID_BREAKPOINT)
+ breakpoints_to_disable.append (break5)
+
+ break_returnStruct_call_super = target.BreakpointCreateBySourceRegex ('// Source returnsStruct call line.', self.main_source_spec)
+ self.assertTrue(break_returnStruct_call_super, VALID_BREAKPOINT)
+ breakpoints_to_disable.append (break_returnStruct_call_super)
+
+ break_step_nil = target.BreakpointCreateBySourceRegex ('// Set nil step breakpoint here.', self.main_source_spec)
+ self.assertTrue(break_step_nil, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ threads = lldbutil.get_threads_stopped_at_breakpoint (process, break1)
+ if len(threads) != 1:
+ self.fail ("Failed to stop at breakpoint 1.")
+
+ thread = threads[0]
+
+ mySource = thread.GetFrameAtIndex(0).FindVariable("mySource")
+ self.assertTrue(mySource, "Found mySource local variable.")
+ mySource_isa = mySource.GetChildMemberWithName ("isa")
+ self.assertTrue(mySource_isa, "Found mySource->isa local variable.")
+ className = mySource_isa.GetSummary ()
+
+ if self.TraceOn():
+ print(mySource_isa)
+
+ # Lets delete mySource so we can check that after stepping a child variable
+ # with no parent persists and is useful.
+ del (mySource)
+
+ # Now step in, that should leave us in the Source randomMethod:
+ thread.StepInto()
+ line_number = thread.GetFrameAtIndex(0).GetLineEntry().GetLine()
+ self.assertTrue (line_number == self.source_randomMethod_line, "Stepped into Source randomMethod.")
+
+ # Now step in again, through the super call, and that should leave us in the SourceBase randomMethod:
+ thread.StepInto()
+ line_number = thread.GetFrameAtIndex(0).GetLineEntry().GetLine()
+ self.assertTrue (line_number == self.sourceBase_randomMethod_line, "Stepped through super into SourceBase randomMethod.")
+
+ threads = lldbutil.continue_to_breakpoint (process, break2)
+ self.assertTrue (len(threads) == 1, "Continued to second breakpoint in main.")
+
+ # Again, step in twice gets us to a stret method and a stret super call:
+ thread = threads[0]
+ thread.StepInto()
+ line_number = thread.GetFrameAtIndex(0).GetLineEntry().GetLine()
+ self.assertTrue (line_number == self.source_returnsStruct_start_line, "Stepped into Source returnsStruct.")
+
+ threads = lldbutil.continue_to_breakpoint (process, break_returnStruct_call_super)
+ self.assertTrue (len(threads) == 1, "Stepped to the call super line in Source returnsStruct.")
+ thread = threads[0]
+
+ thread.StepInto()
+ line_number = thread.GetFrameAtIndex(0).GetLineEntry().GetLine()
+ self.assertTrue (line_number == self.sourceBase_returnsStruct_start_line, "Stepped through super into SourceBase returnsStruct.")
+
+ # Cool now continue to get past the call that initializes the Observer, and then do our steps in again to see that
+ # we can find our way when we're stepping through a KVO swizzled object.
+
+ threads = lldbutil.continue_to_breakpoint (process, break3)
+ self.assertTrue (len(threads) == 1, "Continued to third breakpoint in main, our object should now be swizzled.")
+
+ newClassName = mySource_isa.GetSummary ()
+
+ if self.TraceOn():
+ print(mySource_isa)
+
+ self.assertTrue (newClassName != className, "The isa did indeed change, swizzled!")
+
+ # Now step in, that should leave us in the Source randomMethod:
+ thread = threads[0]
+ thread.StepInto()
+ line_number = thread.GetFrameAtIndex(0).GetLineEntry().GetLine()
+ self.assertTrue (line_number == self.source_randomMethod_line, "Stepped into Source randomMethod in swizzled object.")
+
+ # Now step in again, through the super call, and that should leave us in the SourceBase randomMethod:
+ thread.StepInto()
+ line_number = thread.GetFrameAtIndex(0).GetLineEntry().GetLine()
+ self.assertTrue (line_number == self.sourceBase_randomMethod_line, "Stepped through super into SourceBase randomMethod in swizzled object.")
+
+ threads = lldbutil.continue_to_breakpoint (process, break4)
+ self.assertTrue (len(threads) == 1, "Continued to fourth breakpoint in main.")
+ thread = threads[0]
+
+ # Again, step in twice gets us to a stret method and a stret super call:
+ thread.StepInto()
+ line_number = thread.GetFrameAtIndex(0).GetLineEntry().GetLine()
+ self.assertTrue (line_number == self.source_returnsStruct_start_line, "Stepped into Source returnsStruct in swizzled object.")
+
+ threads = lldbutil.continue_to_breakpoint(process, break_returnStruct_call_super)
+ self.assertTrue (len(threads) == 1, "Stepped to the call super line in Source returnsStruct - second time.")
+ thread = threads[0]
+
+ thread.StepInto()
+ line_number = thread.GetFrameAtIndex(0).GetLineEntry().GetLine()
+ self.assertTrue (line_number == self.sourceBase_returnsStruct_start_line, "Stepped through super into SourceBase returnsStruct in swizzled object.")
+
+ for bkpt in breakpoints_to_disable:
+ bkpt.SetEnabled(False)
+
+ threads = lldbutil.continue_to_breakpoint (process, break_step_nil)
+ self.assertTrue (len(threads) == 1, "Continued to step nil breakpoint.")
+
+ thread.StepInto()
+ line_number = thread.GetFrameAtIndex(0).GetLineEntry().GetLine()
+ self.assertTrue (line_number == self.stepped_past_nil_line, "Step in over dispatch to nil stepped over.")
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-stepping/stepping-tests.m b/packages/Python/lldbsuite/test/lang/objc/objc-stepping/stepping-tests.m
new file mode 100644
index 000000000000..63db536dee49
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-stepping/stepping-tests.m
@@ -0,0 +1,138 @@
+#import <Foundation/Foundation.h>
+#include <stdio.h>
+
+struct return_me
+{
+ int first;
+ int second;
+};
+
+@interface SourceBase: NSObject
+{
+ struct return_me my_return;
+}
+- (SourceBase *) initWithFirst: (int) first andSecond: (int) second;
+- (void) randomMethod;
+- (struct return_me) returnsStruct;
+@end
+
+@implementation SourceBase
+- (void) randomMethod
+{
+ printf ("Called in SourceBase version of randomMethod.\n"); // SourceBase randomMethod start line.
+}
+
+- (struct return_me) returnsStruct
+{
+ return my_return; // SourceBase returnsStruct start line.
+}
+
+- (SourceBase *) initWithFirst: (int) first andSecond: (int) second
+{
+ my_return.first = first;
+ my_return.second = second;
+
+ return self;
+}
+@end
+
+@interface Source : SourceBase
+{
+ int _property;
+}
+- (void) setProperty: (int) newValue;
+- (void) randomMethod;
+- (struct return_me) returnsStruct;
+@end
+
+@implementation Source
+- (void) setProperty: (int) newValue
+{
+ _property = newValue;
+}
+
+- (void) randomMethod
+{
+ [super randomMethod]; // Source randomMethod start line.
+ printf ("Called in Source version of random method.");
+}
+
+- (struct return_me) returnsStruct
+{
+ printf ("Called in Source version of returnsStruct.\n"); // Source returnsStruct start line.
+ return [super returnsStruct]; // Source returnsStruct call line.
+}
+
+@end
+
+@interface Observer : NSObject
+{
+ Source *_source;
+}
++ (Observer *) observerWithSource: (Source *) source;
+- (Observer *) initWithASource: (Source *) source;
+- (void) observeValueForKeyPath: (NSString *) path
+ ofObject: (id) object
+ change: (NSDictionary *) change
+ context: (void *) context;
+@end
+
+@implementation Observer
+
++ (Observer *) observerWithSource: (Source *) inSource;
+{
+ Observer *retval;
+
+ retval = [[Observer alloc] initWithASource: inSource];
+ return retval;
+}
+
+- (Observer *) initWithASource: (Source *) source
+{
+ [super init];
+ _source = source;
+ [_source addObserver: self
+ forKeyPath: @"property"
+ options: (NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
+ context: NULL];
+ return self;
+}
+
+- (void) observeValueForKeyPath: (NSString *) path
+ ofObject: (id) object
+ change: (NSDictionary *) change
+ context: (void *) context
+{
+ printf ("Observer function called.\n");
+ return;
+}
+@end
+
+int main ()
+{
+ Source *mySource;
+ Observer *myObserver;
+ struct return_me ret_val;
+
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+
+ mySource = [[Source alloc] init];
+
+ [mySource randomMethod]; // Set first breakpoint here.
+ ret_val = [mySource returnsStruct]; // Set second breakpoint here.
+
+ myObserver = [Observer observerWithSource: mySource];
+
+ [mySource randomMethod]; // Set third breakpoint here.
+ ret_val = [mySource returnsStruct]; // Set fourth breakpoint here.
+ [mySource setProperty: 5]; // Set fifth breakpoint here.
+
+ // We also had a bug where stepping into a method dispatch to nil turned
+ // into continue. So make sure that works here:
+
+ mySource = nil;
+ [mySource randomMethod]; // Set nil step breakpoint here.
+ [pool release]; // Step over nil should stop here.
+ return 0;
+
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/Makefile
new file mode 100644
index 000000000000..c16802966cff
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := test.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/TestObjCStructArgument.py b/packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/TestObjCStructArgument.py
new file mode 100644
index 000000000000..36cde21c9d66
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/TestObjCStructArgument.py
@@ -0,0 +1,57 @@
+"""Test passing structs to Objective-C methods."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestObjCStructArgument(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "test.m"
+ self.break_line = line_number(self.main_source, '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ def test_with_python_api(self):
+ """Test passing structs to Objective-C methods."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ bpt = target.BreakpointCreateByLocation(self.main_source, self.break_line)
+ self.assertTrue(bpt, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, bpt)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ self.expect("p [summer sumThings:tts]", substrs = ['9'])
+
+ self.expect("po [NSValue valueWithRect:rect]", substrs = ['NSRect: {{0, 0}, {10, 20}}'])
+
+ # Now make sure we can call a method that returns a struct without crashing.
+ cmd_value = frame.EvaluateExpression ("[provider getRange]")
+ self.assertTrue (cmd_value.IsValid())
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/test.m b/packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/test.m
new file mode 100644
index 000000000000..8bf0ec07b710
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-struct-argument/test.m
@@ -0,0 +1,34 @@
+#import <Foundation/Foundation.h>
+
+struct things_to_sum {
+ int a;
+ int b;
+ int c;
+};
+
+@interface ThingSummer : NSObject {
+};
+-(int)sumThings:(struct things_to_sum)tts;
+@end
+
+@implementation ThingSummer
+-(int)sumThings:(struct things_to_sum)tts
+{
+ return tts.a + tts.b + tts.c;
+}
+@end
+
+int main()
+{
+ @autoreleasepool
+ {
+ ThingSummer *summer = [ThingSummer alloc];
+ struct things_to_sum tts = { 2, 3, 4 };
+ int ret = [summer sumThings:tts];
+
+ NSRect rect = {{0, 0}, {10, 20}};
+
+ // Set breakpoint here.
+ return rect.origin.x;
+ }
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-struct-return/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-struct-return/Makefile
new file mode 100644
index 000000000000..c16802966cff
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-struct-return/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := test.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-struct-return/TestObjCStructReturn.py b/packages/Python/lldbsuite/test/lang/objc/objc-struct-return/TestObjCStructReturn.py
new file mode 100644
index 000000000000..010de2180825
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-struct-return/TestObjCStructReturn.py
@@ -0,0 +1,53 @@
+"""Test calling functions in class methods."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestObjCClassMethod(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "test.m"
+ self.break_line = line_number(self.main_source, '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ @add_test_categories(['pyapi'])
+ def test_with_python_api(self):
+ """Test calling functions in class methods."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ bpt = target.BreakpointCreateByLocation(self.main_source, self.break_line)
+ self.assertTrue(bpt, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, bpt)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ # Now make sure we can call a method that returns a struct without crashing.
+ cmd_value = frame.EvaluateExpression ("[provider getRange]")
+ self.assertTrue (cmd_value.IsValid())
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-struct-return/test.m b/packages/Python/lldbsuite/test/lang/objc/objc-struct-return/test.m
new file mode 100644
index 000000000000..aafe231ea817
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-struct-return/test.m
@@ -0,0 +1,23 @@
+#import <Foundation/Foundation.h>
+
+@interface RangeProvider : NSObject {
+};
+-(NSRange)getRange;
+@end
+
+@implementation RangeProvider
+-(NSRange)getRange
+{
+ return NSMakeRange(0, 3);
+}
+@end
+
+int main()
+{
+ @autoreleasepool
+ {
+ RangeProvider *provider = [RangeProvider alloc];
+ NSRange range = [provider getRange]; // Set breakpoint here.
+ return 0;
+ }
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-super/Makefile b/packages/Python/lldbsuite/test/lang/objc/objc-super/Makefile
new file mode 100644
index 000000000000..c2d07910a6e8
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-super/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := class.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-super/TestObjCSuper.py b/packages/Python/lldbsuite/test/lang/objc/objc-super/TestObjCSuper.py
new file mode 100644
index 000000000000..84d147f632da
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-super/TestObjCSuper.py
@@ -0,0 +1,59 @@
+"""Test calling methods on super."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+import lldbsuite.test.lldbutil as lldbutil
+from lldbsuite.test.lldbtest import *
+
+class TestObjCSuperMethod(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # Find the line numbers to break inside main().
+ self.main_source = "class.m"
+ self.break_line = line_number(self.main_source, '// Set breakpoint here.')
+
+ @skipUnlessDarwin
+ @expectedFailurei386
+ @add_test_categories(['pyapi'])
+ def test_with_python_api(self):
+ """Test calling methods on super."""
+ self.build()
+ exe = os.path.join(os.getcwd(), "a.out")
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ bpt = target.BreakpointCreateByLocation(self.main_source, self.break_line)
+ self.assertTrue(bpt, VALID_BREAKPOINT)
+
+ # Now launch the process, and do not stop at entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.assertTrue(process, PROCESS_IS_VALID)
+
+ # The stop reason of the thread should be breakpoint.
+ thread_list = lldbutil.get_threads_stopped_at_breakpoint (process, bpt)
+
+ # Make sure we stopped at the first breakpoint.
+ self.assertTrue (len(thread_list) != 0, "No thread stopped at our breakpoint.")
+ self.assertTrue (len(thread_list) == 1, "More than one thread stopped at our breakpoint.")
+
+ # Now make sure we can call a function in the class method we've stopped in.
+ frame = thread_list[0].GetFrameAtIndex(0)
+ self.assertTrue (frame, "Got a valid frame 0 frame.")
+
+ cmd_value = frame.EvaluateExpression ("[self get]")
+ self.assertTrue (cmd_value.IsValid())
+ self.assertTrue (cmd_value.GetValueAsUnsigned() == 2)
+
+ cmd_value = frame.EvaluateExpression ("[super get]")
+ self.assertTrue (cmd_value.IsValid())
+ self.assertTrue (cmd_value.GetValueAsUnsigned() == 1)
diff --git a/packages/Python/lldbsuite/test/lang/objc/objc-super/class.m b/packages/Python/lldbsuite/test/lang/objc/objc-super/class.m
new file mode 100644
index 000000000000..b55b649aaaec
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/objc-super/class.m
@@ -0,0 +1,39 @@
+#import <Foundation/Foundation.h>
+
+@interface Foo : NSObject {
+}
+-(int)get;
+@end
+
+@implementation Foo
+-(int)get
+{
+ return 1;
+}
+@end
+
+@interface Bar : Foo {
+}
+-(int)get;
+@end
+
+@implementation Bar
+-(int)get
+{
+ return 2;
+}
+
+-(int)callme
+{
+ return [self get]; // Set breakpoint here.
+}
+@end
+
+int main()
+{
+ @autoreleasepool
+ {
+ Bar *bar = [Bar alloc];
+ return [bar callme];
+ }
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/print-obj/Makefile b/packages/Python/lldbsuite/test/lang/objc/print-obj/Makefile
new file mode 100644
index 000000000000..dba1065cd714
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/print-obj/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := blocked.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/print-obj/TestPrintObj.py b/packages/Python/lldbsuite/test/lang/objc/print-obj/TestPrintObj.py
new file mode 100644
index 000000000000..5c52cc0e0697
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/print-obj/TestPrintObj.py
@@ -0,0 +1,87 @@
+"""
+Test "print object" where another thread blocks the print object from making progress.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+
+@skipUnlessDarwin
+class PrintObjTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # My source program.
+ self.source = "blocked.m"
+ # Find the line numbers to break at.
+ self.line = line_number(self.source, '// Set a breakpoint here.')
+
+ def test_print_obj(self):
+ """
+ Test "print object" where another thread blocks the print object from making progress.
+
+ Set a breakpoint on the line in my_pthread_routine. Then switch threads
+ to the main thread, and do print the lock_me object. Since that will
+ try to get the lock already gotten by my_pthread_routime thread, it will
+ have to switch to running all threads, and that should then succeed.
+ """
+ d = {'EXE': 'b.out'}
+ self.build(dictionary=d)
+ self.setTearDownCleanup(dictionary=d)
+ exe = os.path.join(os.getcwd(), 'b.out')
+
+ target = self.dbg.CreateTarget(exe)
+ self.assertTrue(target, VALID_TARGET)
+
+ breakpoint = target.BreakpointCreateByLocation(self.source, self.line)
+ self.assertTrue(breakpoint, VALID_BREAKPOINT)
+ self.runCmd("breakpoint list")
+
+ # Launch the process, and do not stop at the entry point.
+ process = target.LaunchSimple (None, None, self.get_process_working_directory())
+
+ self.runCmd("thread backtrace all")
+
+ # Let's get the current stopped thread. We'd like to switch to the
+ # other thread to issue our 'po lock_me' command.
+ import lldbsuite.test.lldbutil as lldbutil
+ this_thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint)
+ self.assertTrue(this_thread)
+
+ # Find the other thread. The iteration protocol of SBProcess and the
+ # rich comparison methods (__eq__/__ne__) of SBThread come in handy.
+ other_thread = None
+ for t in process:
+ if t != this_thread:
+ other_thread = t
+ break
+
+ # Set the other thread as the selected thread to issue our 'po' command.other
+ self.assertTrue(other_thread)
+ process.SetSelectedThread(other_thread)
+ if self.TraceOn():
+ print("selected thread:" + lldbutil.get_description(other_thread))
+ self.runCmd("thread backtrace")
+
+ # We want to traverse the frame to the one corresponding to blocked.m to
+ # issue our 'po lock_me' command.
+
+ depth = other_thread.GetNumFrames()
+ for i in range(depth):
+ frame = other_thread.GetFrameAtIndex(i)
+ name = frame.GetFunctionName()
+ if name == 'main':
+ other_thread.SetSelectedFrame(i)
+ if self.TraceOn():
+ print("selected frame:" + lldbutil.get_description(frame))
+ break
+
+ self.expect("po lock_me", OBJECT_PRINTED_CORRECTLY,
+ substrs = ['I am pretty special.'])
diff --git a/packages/Python/lldbsuite/test/lang/objc/print-obj/blocked.m b/packages/Python/lldbsuite/test/lang/objc/print-obj/blocked.m
new file mode 100644
index 000000000000..ba2497554444
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/print-obj/blocked.m
@@ -0,0 +1,73 @@
+//===-- blocked.m --------------------------------------------------*- ObjC -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// This file is for testing running "print object" in a case where another thread
+// blocks the print object from making progress. Set a breakpoint on the line in
+// my_pthread_routine as indicated. Then switch threads to the main thread, and
+// do print the lock_me object. Since that will try to get the lock already gotten
+// by my_pthread_routime thread, it will have to switch to running all threads, and
+// that should then succeed.
+//
+
+#include <Foundation/Foundation.h>
+#include <pthread.h>
+
+static pthread_mutex_t test_mutex;
+
+static void Mutex_Init (void)
+{
+ pthread_mutexattr_t tmp_mutex_attr;
+ pthread_mutexattr_init(&tmp_mutex_attr);
+ pthread_mutex_init(&test_mutex, &tmp_mutex_attr);
+}
+
+@interface LockMe :NSObject
+{
+
+}
+- (NSString *) description;
+@end
+
+@implementation LockMe
+- (NSString *) description
+{
+ printf ("LockMe trying to get the lock.\n");
+ pthread_mutex_lock(&test_mutex);
+ printf ("LockMe got the lock.\n");
+ pthread_mutex_unlock(&test_mutex);
+ return @"I am pretty special.\n";
+}
+@end
+
+void *
+my_pthread_routine (void *data)
+{
+ printf ("my_pthread_routine about to enter.\n");
+ pthread_mutex_lock(&test_mutex);
+ printf ("Releasing Lock.\n"); // Set a breakpoint here.
+ pthread_mutex_unlock(&test_mutex);
+ return NULL;
+}
+
+int
+main ()
+{
+ pthread_attr_t tmp_attr;
+ pthread_attr_init (&tmp_attr);
+ pthread_t my_pthread;
+
+ Mutex_Init ();
+
+ LockMe *lock_me = [[LockMe alloc] init];
+ pthread_create (&my_pthread, &tmp_attr, my_pthread_routine, NULL);
+
+ pthread_join (my_pthread, NULL);
+
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/radar-9691614/Makefile b/packages/Python/lldbsuite/test/lang/objc/radar-9691614/Makefile
new file mode 100644
index 000000000000..ad3cb3fadcde
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/radar-9691614/Makefile
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+
+include $(LEVEL)/Makefile.rules
+
+LDFLAGS += -framework Foundation
diff --git a/packages/Python/lldbsuite/test/lang/objc/radar-9691614/TestObjCMethodReturningBOOL.py b/packages/Python/lldbsuite/test/lang/objc/radar-9691614/TestObjCMethodReturningBOOL.py
new file mode 100644
index 000000000000..38551f671a92
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/radar-9691614/TestObjCMethodReturningBOOL.py
@@ -0,0 +1,45 @@
+"""
+Test that objective-c method returning BOOL works correctly.
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+@skipUnlessDarwin
+class MethodReturningBOOLTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # We'll use the test method name as the exe_name.
+ self.exe_name = self.testMethodName
+ # Find the line number to break inside main().
+ self.main_source = "main.m"
+ self.line = line_number(self.main_source, '// Set breakpoint here.')
+
+ def test_method_ret_BOOL(self):
+ """Test that objective-c method returning BOOL works correctly."""
+ d = {'EXE': self.exe_name}
+ self.build(dictionary=d)
+ self.setTearDownCleanup(dictionary=d)
+
+ exe = os.path.join(os.getcwd(), self.exe_name)
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+ self.expect("process status", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = [" at %s:%d" % (self.main_source, self.line),
+ "stop reason = breakpoint"])
+
+ # rdar://problem/9691614
+ self.runCmd('p (int)[my isValid]')
diff --git a/packages/Python/lldbsuite/test/lang/objc/radar-9691614/main.m b/packages/Python/lldbsuite/test/lang/objc/radar-9691614/main.m
new file mode 100644
index 000000000000..bb87d673452c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/radar-9691614/main.m
@@ -0,0 +1,67 @@
+#import <Foundation/Foundation.h>
+#include <stdio.h>
+
+@interface MyString : NSObject {
+ NSString *str;
+ NSDate *date;
+ BOOL _is_valid;
+}
+
+- (id)initWithNSString:(NSString *)string;
+- (BOOL)isValid;
+@end
+
+@implementation MyString
+- (id)initWithNSString:(NSString *)string
+{
+ if (self = [super init])
+ {
+ str = [NSString stringWithString:string];
+ date = [NSDate date];
+ }
+ _is_valid = YES;
+ return self;
+}
+
+- (BOOL)isValid
+{
+ return _is_valid;
+}
+
+- (void)dealloc
+{
+ [date release];
+ [str release];
+ [super dealloc];
+}
+
+- (NSString *)description
+{
+ return [str stringByAppendingFormat:@" with timestamp: %@", date];
+}
+@end
+
+void
+Test_MyString (const char *program)
+{
+ NSString *str = [NSString stringWithFormat:@"Hello from '%s'", program];
+ MyString *my = [[MyString alloc] initWithNSString:str];
+ if ([my isValid])
+ printf("my is valid!\n");
+
+ NSLog(@"NSString instance: %@", [str description]); // Set breakpoint here.
+ // Test 'p (int)[my isValid]'.
+ // The expression parser should not crash -- rdar://problem/9691614.
+
+ NSLog(@"MyString instance: %@", [my description]);
+}
+
+int main (int argc, char const *argv[])
+{
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+
+ Test_MyString (argv[0]);
+
+ [pool release];
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/rdar-10967107/Makefile b/packages/Python/lldbsuite/test/lang/objc/rdar-10967107/Makefile
new file mode 100644
index 000000000000..ad3cb3fadcde
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/rdar-10967107/Makefile
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+
+include $(LEVEL)/Makefile.rules
+
+LDFLAGS += -framework Foundation
diff --git a/packages/Python/lldbsuite/test/lang/objc/rdar-10967107/TestRdar10967107.py b/packages/Python/lldbsuite/test/lang/objc/rdar-10967107/TestRdar10967107.py
new file mode 100644
index 000000000000..0902527d424c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/rdar-10967107/TestRdar10967107.py
@@ -0,0 +1,44 @@
+"""
+Test that CoreFoundation classes CFGregorianDate and CFRange are not improperly uniqued
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+@skipUnlessDarwin
+class Rdar10967107TestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # We'll use the test method name as the exe_name.
+ self.exe_name = self.testMethodName
+ # Find the line number to break inside main().
+ self.main_source = "main.m"
+ self.line = line_number(self.main_source, '// Set breakpoint here.')
+
+ def test_cfrange_diff_cfgregoriandate(self):
+ """Test that CoreFoundation classes CFGregorianDate and CFRange are not improperly uniqued."""
+ d = {'EXE': self.exe_name}
+ self.build(dictionary=d)
+ self.setTearDownCleanup(dictionary=d)
+
+ exe = os.path.join(os.getcwd(), self.exe_name)
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, self.main_source, self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+ # check that each type is correctly bound to its list of children
+ self.expect("frame variable cf_greg_date --raw", substrs = ['year','month','day','hour','minute','second'])
+ self.expect("frame variable cf_range --raw", substrs = ['location','length'])
+ # check that printing both does not somehow confuse LLDB
+ self.expect("frame variable --raw", substrs = ['year','month','day','hour','minute','second','location','length'])
diff --git a/packages/Python/lldbsuite/test/lang/objc/rdar-10967107/main.m b/packages/Python/lldbsuite/test/lang/objc/rdar-10967107/main.m
new file mode 100644
index 000000000000..386a458950b6
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/rdar-10967107/main.m
@@ -0,0 +1,13 @@
+#import <Foundation/Foundation.h>
+
+int main (int argc, char const *argv[])
+{
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+
+ NSDate *date1 = [NSDate date];
+ CFGregorianDate cf_greg_date = CFAbsoluteTimeGetGregorianDate(CFDateGetAbsoluteTime((CFDateRef)date1), NULL);
+ CFRange cf_range = {4,4};
+
+ [pool release]; // Set breakpoint here.
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/rdar-11355592/Makefile b/packages/Python/lldbsuite/test/lang/objc/rdar-11355592/Makefile
new file mode 100644
index 000000000000..ad3cb3fadcde
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/rdar-11355592/Makefile
@@ -0,0 +1,7 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+
+include $(LEVEL)/Makefile.rules
+
+LDFLAGS += -framework Foundation
diff --git a/packages/Python/lldbsuite/test/lang/objc/rdar-11355592/TestRdar11355592.py b/packages/Python/lldbsuite/test/lang/objc/rdar-11355592/TestRdar11355592.py
new file mode 100644
index 000000000000..42120a57834c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/rdar-11355592/TestRdar11355592.py
@@ -0,0 +1,65 @@
+"""
+Test that we do not attempt to make a dynamic type for a 'const char*'
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+@skipUnlessDarwin
+class Rdar10967107TestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # We'll use the test method name as the exe_name.
+ self.exe_name = self.testMethodName
+ # Find the line number to break inside main().
+ self.main_source = "main.m"
+ self.line = line_number(self.main_source, '// Set breakpoint here.')
+
+ def test_charstar_dyntype(self):
+ """Test that we do not attempt to make a dynamic type for a 'const char*'"""
+ d = {'EXE': self.exe_name}
+ self.build(dictionary=d)
+ self.setTearDownCleanup(dictionary=d)
+
+ exe = os.path.join(os.getcwd(), self.exe_name)
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, self.main_source, self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+ # check that we correctly see the const char*, even with dynamic types on
+ self.expect("frame variable my_string", substrs = ['const char *'])
+ self.expect("frame variable my_string --dynamic-type run-target", substrs = ['const char *'])
+ # check that expr also gets it right
+ self.expect("expr my_string", substrs = ['const char *'])
+ self.expect("expr -d run -- my_string", substrs = ['const char *'])
+ # but check that we get the real Foolie as such
+ self.expect("frame variable my_foolie", substrs = ['FoolMeOnce *'])
+ self.expect("frame variable my_foolie --dynamic-type run-target", substrs = ['FoolMeOnce *'])
+ # check that expr also gets it right
+ self.expect("expr my_foolie", substrs = ['FoolMeOnce *'])
+ self.expect("expr -d run -- my_foolie", substrs = ['FoolMeOnce *'])
+ # now check that assigning a true string does not break anything
+ self.runCmd("next")
+ # check that we correctly see the const char*, even with dynamic types on
+ self.expect("frame variable my_string", substrs = ['const char *'])
+ self.expect("frame variable my_string --dynamic-type run-target", substrs = ['const char *'])
+ # check that expr also gets it right
+ self.expect("expr my_string", substrs = ['const char *'])
+ self.expect("expr -d run -- my_string", substrs = ['const char *'])
+ # but check that we get the real Foolie as such
+ self.expect("frame variable my_foolie", substrs = ['FoolMeOnce *'])
+ self.expect("frame variable my_foolie --dynamic-type run-target", substrs = ['FoolMeOnce *'])
+ # check that expr also gets it right
+ self.expect("expr my_foolie", substrs = ['FoolMeOnce *'])
+ self.expect("expr -d run -- my_foolie", substrs = ['FoolMeOnce *'])
diff --git a/packages/Python/lldbsuite/test/lang/objc/rdar-11355592/main.m b/packages/Python/lldbsuite/test/lang/objc/rdar-11355592/main.m
new file mode 100644
index 000000000000..09b3b18a7878
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/rdar-11355592/main.m
@@ -0,0 +1,37 @@
+#import <Foundation/Foundation.h>
+
+@interface FoolMeOnce : NSObject
+{
+ int32_t value_one; // ivars needed to make 32-bit happy
+ int32_t value_two;
+}
+- (FoolMeOnce *) initWithFirst: (int32_t) first andSecond: (int32_t) second;
+
+@property int32_t value_one;
+@property int32_t value_two;
+
+@end
+
+@implementation FoolMeOnce
+@synthesize value_one;
+@synthesize value_two;
+- (FoolMeOnce *) initWithFirst: (int32_t) first andSecond: (int32_t) second
+{
+ value_one = first;
+ value_two = second;
+ return self;
+}
+@end
+
+int main (int argc, char const *argv[])
+{
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+
+ FoolMeOnce *my_foolie = [[FoolMeOnce alloc] initWithFirst: 20 andSecond: 55];
+ const char *my_string = (char *) my_foolie;
+
+ my_string = "Now this is a REAL string..."; // Set breakpoint here.
+
+ [pool release];
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/rdar-12408181/Makefile b/packages/Python/lldbsuite/test/lang/objc/rdar-12408181/Makefile
new file mode 100644
index 000000000000..385b557c9af0
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/rdar-12408181/Makefile
@@ -0,0 +1,11 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+
+include $(LEVEL)/Makefile.rules
+
+ifneq (,$(findstring arm,$(ARCH)))
+ LD_EXTRAS = -framework Foundation -framework UIKit
+else
+ LD_EXTRAS = -framework Foundation -framework Cocoa
+endif
diff --git a/packages/Python/lldbsuite/test/lang/objc/rdar-12408181/TestRdar12408181.py b/packages/Python/lldbsuite/test/lang/objc/rdar-12408181/TestRdar12408181.py
new file mode 100644
index 000000000000..b95d95106032
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/rdar-12408181/TestRdar12408181.py
@@ -0,0 +1,48 @@
+"""
+Test that we are able to find out how many children NSWindow has
+"""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+@skipUnlessDarwin
+class Rdar12408181TestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ def setUp(self):
+ # Call super's setUp().
+ TestBase.setUp(self)
+ # We'll use the test method name as the exe_name.
+ self.exe_name = self.testMethodName
+ # Find the line number to break inside main().
+ self.main_source = "main.m"
+ self.line = line_number(self.main_source, '// Set breakpoint here.')
+
+ def test_nswindow_count(self):
+ """Test that we are able to find out how many children NSWindow has."""
+ d = {'EXE': self.exe_name}
+ self.build(dictionary=d)
+ self.setTearDownCleanup(dictionary=d)
+
+ exe = os.path.join(os.getcwd(), self.exe_name)
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ lldbutil.run_break_set_by_file_and_line (self, self.main_source, self.line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+ if self.frame().EvaluateExpression('(void*)_CGSDefaultConnection()').GetValueAsUnsigned() != 0:
+ window = self.frame().FindVariable("window")
+ window_dynamic = window.GetDynamicValue(lldb.eDynamicCanRunTarget)
+ self.assertTrue(window.GetNumChildren() > 1, "NSWindow (static) only has 1 child!")
+ self.assertTrue(window_dynamic.GetNumChildren() > 1, "NSWindow (dynamic) only has 1 child!")
+ self.assertTrue(window.GetChildAtIndex(0).IsValid(), "NSWindow (static) has an invalid child")
+ self.assertTrue(window_dynamic.GetChildAtIndex(0).IsValid(), "NSWindow (dynamic) has an invalid child")
+ else:
+ self.skipTest('no WindowServer connection')
diff --git a/packages/Python/lldbsuite/test/lang/objc/rdar-12408181/main.m b/packages/Python/lldbsuite/test/lang/objc/rdar-12408181/main.m
new file mode 100644
index 000000000000..858ba2a4a22f
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/rdar-12408181/main.m
@@ -0,0 +1,24 @@
+#import <Foundation/Foundation.h>
+#if defined (__i386__) || defined (__x86_64__)
+#import <Cocoa/Cocoa.h>
+#else
+#import <UIKit/UIKit.h>
+#endif
+
+int main (int argc, char const *argv[])
+{
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+#if defined (__i386__) || defined (__x86_64__)
+
+ [NSApplication sharedApplication];
+ NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0,0,100,100) styleMask:NSBorderlessWindowMask backing:NSBackingStoreRetained defer:NO];
+ [window setCanHide:YES];
+#else
+ [UIApplication sharedApplication];
+ CGRect rect = { 0, 0, 100, 100};
+ UIWindow* window = [[UIWindow alloc] initWithFrame:rect];
+#endif
+ [pool release]; // Set breakpoint here.
+ return 0;
+}
+
diff --git a/packages/Python/lldbsuite/test/lang/objc/real-definition/Bar.h b/packages/Python/lldbsuite/test/lang/objc/real-definition/Bar.h
new file mode 100644
index 000000000000..20a81faa1017
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/real-definition/Bar.h
@@ -0,0 +1,12 @@
+#import <Foundation/Foundation.h>
+
+@class InternalClass;
+
+@interface Bar : NSObject {
+ @private
+ InternalClass *storage;
+}
+
+- (NSString *)description;
+
+@end \ No newline at end of file
diff --git a/packages/Python/lldbsuite/test/lang/objc/real-definition/Bar.m b/packages/Python/lldbsuite/test/lang/objc/real-definition/Bar.m
new file mode 100644
index 000000000000..46d7e3888751
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/real-definition/Bar.m
@@ -0,0 +1,43 @@
+#import "Bar.h"
+
+@interface InternalClass : NSObject {
+ @public
+ NSString *foo;
+ NSString *bar;
+}
+@end
+
+@implementation InternalClass
+@end
+
+@interface Bar ()
+{
+ NSString *_hidden_ivar;
+}
+
+@end
+
+@implementation Bar
+
+- (id)init
+{
+ self = [super init];
+ if (self) {
+ _hidden_ivar = [NSString stringWithFormat:@"%p: @Bar", self];
+ }
+ return self; // Set breakpoint where Bar is an implementation
+}
+
+- (void)dealloc
+{
+ [_hidden_ivar release];
+ [super dealloc];
+}
+
+- (NSString *)description
+{
+ return [_hidden_ivar copyWithZone:NULL];
+}
+
+@end
+ \ No newline at end of file
diff --git a/packages/Python/lldbsuite/test/lang/objc/real-definition/Foo.h b/packages/Python/lldbsuite/test/lang/objc/real-definition/Foo.h
new file mode 100644
index 000000000000..14ff9eed50fd
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/real-definition/Foo.h
@@ -0,0 +1,11 @@
+#import <Foundation/Foundation.h>
+
+#import "Bar.h"
+
+@interface Foo : NSObject {
+ Bar *_bar;
+}
+
+- (NSString *)description;
+
+@end \ No newline at end of file
diff --git a/packages/Python/lldbsuite/test/lang/objc/real-definition/Foo.m b/packages/Python/lldbsuite/test/lang/objc/real-definition/Foo.m
new file mode 100644
index 000000000000..bcdeaeffc29a
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/real-definition/Foo.m
@@ -0,0 +1,25 @@
+#import "Foo.h"
+
+@implementation Foo
+
+- (id)init
+{
+ self = [super init];
+ if (self) {
+ _bar = [[Bar alloc] init];
+ }
+ return self; // Set breakpoint where Bar is an interface
+}
+
+- (void)dealloc
+{
+ [_bar release];
+ [super dealloc];
+}
+
+- (NSString *)description
+{
+ return [NSString stringWithFormat:@"%p: @Foo { _bar = %@ }", self, _bar];
+}
+
+@end
diff --git a/packages/Python/lldbsuite/test/lang/objc/real-definition/Makefile b/packages/Python/lldbsuite/test/lang/objc/real-definition/Makefile
new file mode 100644
index 000000000000..61cc3b3b6db8
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/real-definition/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := Bar.m Foo.m main.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/real-definition/TestRealDefinition.py b/packages/Python/lldbsuite/test/lang/objc/real-definition/TestRealDefinition.py
new file mode 100644
index 000000000000..30fd2a5b0f6d
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/real-definition/TestRealDefinition.py
@@ -0,0 +1,86 @@
+"""Test that types defined in shared libraries work correctly."""
+
+from __future__ import print_function
+
+
+
+import os, time
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class TestRealDefinition(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipUnlessDarwin
+ def test_frame_var_after_stop_at_interface(self):
+ """Test that we can find the implementation for an objective C type"""
+ if self.getArchitecture() == 'i386':
+ self.skipTest("requires modern objc runtime")
+ self.build()
+ self.common_setup()
+
+ line = line_number('Foo.m', '// Set breakpoint where Bar is an interface')
+ lldbutil.run_break_set_by_file_and_line (self, 'Foo.m', line, num_expected_locations=1, loc_exact=True);
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # Run and stop at Foo
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ self.runCmd("continue", RUN_SUCCEEDED)
+
+ # Run at stop at main
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # This should display correctly.
+ self.expect("frame variable foo->_bar->_hidden_ivar", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["(NSString *)", "foo->_bar->_hidden_ivar = 0x"])
+
+ @skipUnlessDarwin
+ def test_frame_var_after_stop_at_implementation(self):
+ """Test that we can find the implementation for an objective C type"""
+ if self.getArchitecture() == 'i386':
+ self.skipTest("requires modern objc runtime")
+ self.build()
+ self.common_setup()
+
+ line = line_number('Bar.m', '// Set breakpoint where Bar is an implementation')
+ lldbutil.run_break_set_by_file_and_line (self, 'Bar.m', line, num_expected_locations=1, loc_exact=True)
+
+ self.runCmd("run", RUN_SUCCEEDED)
+
+ # The stop reason of the thread should be breakpoint.
+ self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
+ substrs = ['stopped',
+ 'stop reason = breakpoint'])
+
+ # Run and stop at Foo
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ self.runCmd("continue", RUN_SUCCEEDED)
+
+ # Run at stop at main
+ self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
+ substrs = [' resolved, hit count = 1'])
+
+ # This should display correctly.
+ self.expect("frame variable foo->_bar->_hidden_ivar", VARIABLES_DISPLAYED_CORRECTLY,
+ substrs = ["(NSString *)", "foo->_bar->_hidden_ivar = 0x"])
+
+ def common_setup(self):
+ exe = os.path.join(os.getcwd(), "a.out")
+ self.runCmd("file " + exe, CURRENT_EXECUTABLE_SET)
+
+ # Break inside the foo function which takes a bar_ptr argument.
+ line = line_number('main.m', '// Set breakpoint in main')
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
diff --git a/packages/Python/lldbsuite/test/lang/objc/real-definition/main.m b/packages/Python/lldbsuite/test/lang/objc/real-definition/main.m
new file mode 100644
index 000000000000..8c31dc9abb31
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/real-definition/main.m
@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <stdint.h>
+#import <Foundation/Foundation.h>
+#import "Foo.h"
+
+int main (int argc, char const *argv[])
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ Foo *foo = [[Foo alloc] init];
+ NSLog (@"foo is %@", foo); // Set breakpoint in main
+ [pool release];
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/sample/Makefile b/packages/Python/lldbsuite/test/lang/objc/sample/Makefile
new file mode 100644
index 000000000000..a1608fe5a664
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/sample/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/sample/main.m b/packages/Python/lldbsuite/test/lang/objc/sample/main.m
new file mode 100644
index 000000000000..9dffc71aaac6
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/sample/main.m
@@ -0,0 +1,70 @@
+#import <Foundation/Foundation.h>
+
+
+@interface MyString : NSObject {
+ NSString *_string;
+ NSDate *_date;
+}
+- (id)initWithNSString:(NSString *)string;
+
+@property (copy) NSString *string;
+@property (readonly,getter=getTheDate) NSDate *date;
+
+- (NSDate *) getTheDate;
+@end
+
+@implementation MyString
+
+@synthesize string = _string;
+@synthesize date = _date;
+
+- (id)initWithNSString:(NSString *)string
+{
+ if (self = [super init])
+ {
+ _string = [NSString stringWithString:string];
+ _date = [NSDate date];
+ }
+ return self;
+}
+
+- (void) dealloc
+{
+ [_date release];
+ [_string release];
+ [super dealloc];
+}
+
+- (NSDate *) getTheDate
+{
+ return _date;
+}
+
+- (NSString *)description
+{
+ return [_string stringByAppendingFormat:@" with timestamp: %@", _date];
+}
+@end
+
+int main (int argc, char const *argv[])
+{
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ static NSString *g_global_nsstr = @"Howdy";
+
+ MyString *myStr = [[MyString alloc] initWithNSString: [NSString stringWithFormat:@"string %i", 1]];
+ NSString *str1 = myStr.string;
+ NSString *str2 = [NSString stringWithFormat:@"string %i", 2];
+ NSString *str3 = [NSString stringWithFormat:@"string %i", 3];
+ NSArray *array = [NSArray arrayWithObjects: str1, str2, str3, nil];
+ NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
+ str1, @"1",
+ str2, @"2",
+ str3, @"3",
+ myStr.date, @"date",
+ nil];
+
+ id str_id = str1;
+ SEL sel = @selector(length);
+ [pool release];
+ return 0;
+}
diff --git a/packages/Python/lldbsuite/test/lang/objc/self/Makefile b/packages/Python/lldbsuite/test/lang/objc/self/Makefile
new file mode 100644
index 000000000000..bdae30428be4
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/self/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJC_SOURCES := main.m
+LD_EXTRAS ?= -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objc/self/TestObjCSelf.py b/packages/Python/lldbsuite/test/lang/objc/self/TestObjCSelf.py
new file mode 100644
index 000000000000..37db151f9ae3
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/self/TestObjCSelf.py
@@ -0,0 +1,36 @@
+"""
+Tests that ObjC member variables are available where they should be.
+"""
+import lldb
+from lldbsuite.test.lldbtest import *
+import lldbsuite.test.lldbutil as lldbutil
+
+class ObjCSelfTestCase(TestBase):
+
+ mydir = TestBase.compute_mydir(__file__)
+
+ @skipUnlessDarwin
+ def test_with_run_command(self):
+ """Test that the appropriate member variables are available when stopped in Objective-C class and instance methods"""
+ self.build()
+ self.runCmd("file a.out", CURRENT_EXECUTABLE_SET)
+
+ self.set_breakpoint(line_number('main.m', '// breakpoint 1'))
+ self.set_breakpoint(line_number('main.m', '// breakpoint 2'))
+
+ self.runCmd("process launch", RUN_SUCCEEDED)
+
+ self.expect("expression -- m_a = 2",
+ startstr = "(int) $0 = 2")
+
+ self.runCmd("process continue")
+
+ # This would be disallowed if we enforced const. But we don't.
+ self.expect("expression -- m_a = 2",
+ error=True)
+
+ self.expect("expression -- s_a",
+ startstr = "(int) $1 = 5")
+
+ def set_breakpoint(self, line):
+ lldbutil.run_break_set_by_file_and_line (self, "main.m", line, num_expected_locations=1, loc_exact=True)
diff --git a/packages/Python/lldbsuite/test/lang/objc/self/main.m b/packages/Python/lldbsuite/test/lang/objc/self/main.m
new file mode 100644
index 000000000000..928aaf2ff024
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objc/self/main.m
@@ -0,0 +1,54 @@
+//===-- main.m ------------------------------------------*- Objective-C -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#import <Foundation/Foundation.h>
+
+@interface A : NSObject
+{
+ int m_a;
+}
+-(id)init;
+-(void)accessMember:(int)a;
++(void)accessStaticMember:(int)a;
+@end
+
+static int s_a = 5;
+
+@implementation A
+-(id)init
+{
+ self = [super init];
+
+ if (self)
+ m_a = 2;
+
+ return self;
+}
+
+-(void)accessMember:(int)a
+{
+ m_a = a; // breakpoint 1
+}
+
++(void)accessStaticMember:(int)a
+{
+ s_a = a; // breakpoint 2
+}
+@end
+
+int main()
+{
+ NSAutoreleasePool *pool = [NSAutoreleasePool alloc];
+ A *my_a = [[A alloc] init];
+
+ [my_a accessMember:3];
+ [A accessStaticMember:5];
+
+ [pool release];
+}
diff --git a/packages/Python/lldbsuite/test/lang/objcxx/objcxx-ivar-vector/TestIvarVector.py b/packages/Python/lldbsuite/test/lang/objcxx/objcxx-ivar-vector/TestIvarVector.py
new file mode 100644
index 000000000000..80305e303d03
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objcxx/objcxx-ivar-vector/TestIvarVector.py
@@ -0,0 +1,4 @@
+import lldbsuite.test.lldbinline as lldbinline
+import lldbsuite.test.lldbtest as lldbtest
+
+lldbinline.MakeInlineTest(__file__, globals(), [lldbtest.skipIfFreeBSD,lldbtest.skipIfLinux,lldbtest.skipIfWindows])
diff --git a/packages/Python/lldbsuite/test/lang/objcxx/objcxx-ivar-vector/main.mm b/packages/Python/lldbsuite/test/lang/objcxx/objcxx-ivar-vector/main.mm
new file mode 100644
index 000000000000..36eda1da2acb
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objcxx/objcxx-ivar-vector/main.mm
@@ -0,0 +1,33 @@
+#import <Foundation/Foundation.h>
+
+#include <vector>
+
+@interface MyElement : NSObject {
+}
+@end
+
+@interface MyClass : NSObject {
+ std::vector<MyElement *> elements;
+};
+
+-(void)doSomething;
+
+@end
+
+@implementation MyClass
+
+-(void)doSomething
+{
+ NSLog(@"Hello"); //% self.expect("expression -- elements", DATA_TYPES_DISPLAYED_CORRECTLY, substrs = ["vector", "MyElement"]);
+}
+
+@end
+
+int main ()
+{
+ @autoreleasepool
+ {
+ MyClass *c = [MyClass alloc];
+ [c doSomething];
+ }
+}
diff --git a/packages/Python/lldbsuite/test/lang/objcxx/sample/Makefile b/packages/Python/lldbsuite/test/lang/objcxx/sample/Makefile
new file mode 100644
index 000000000000..edd3430de7c8
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objcxx/sample/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+OBJCXX_SOURCES := main.mm
+LDFLAGS = $(CFLAGS) -lobjc -framework Foundation
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/lang/objcxx/sample/main.mm b/packages/Python/lldbsuite/test/lang/objcxx/sample/main.mm
new file mode 100644
index 000000000000..c9a2172c368c
--- /dev/null
+++ b/packages/Python/lldbsuite/test/lang/objcxx/sample/main.mm
@@ -0,0 +1,71 @@
+#import <Foundation/Foundation.h>
+#include <iostream>
+
+@interface MyString : NSObject {
+ NSString *_string;
+ NSDate *_date;
+}
+- (id)initWithNSString:(NSString *)string;
+
+@property (copy) NSString *string;
+@property (readonly,getter=getTheDate) NSDate *date;
+
+- (NSDate *) getTheDate;
+@end
+
+@implementation MyString
+
+@synthesize string = _string;
+@synthesize date = _date;
+
+- (id)initWithNSString:(NSString *)string
+{
+ if (self = [super init])
+ {
+ _string = [NSString stringWithString:string];
+ _date = [NSDate date];
+ }
+ return self;
+}
+
+- (void) dealloc
+{
+ [_date release];
+ [_string release];
+ [super dealloc];
+}
+
+- (NSDate *) getTheDate
+{
+ return _date;
+}
+
+- (NSString *)description
+{
+ return [_string stringByAppendingFormat:@" with timestamp: %@", _date];
+}
+@end
+
+int main (int argc, char const *argv[])
+{
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
+ static NSString *g_global_nsstr = @"Howdy";
+
+ MyString *myStr = [[MyString alloc] initWithNSString: [NSString stringWithFormat:@"string %i", 1]];
+ NSString *str1 = myStr.string;
+ NSString *str2 = [NSString stringWithFormat:@"string %i", 2];
+ NSString *str3 = [NSString stringWithFormat:@"string %i", 3];
+ NSArray *array = [NSArray arrayWithObjects: str1, str2, str3, nil];
+ NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
+ str1, @"1",
+ str2, @"2",
+ str3, @"3",
+ myStr.date, @"date",
+ nil];
+
+ id str_id = str1;
+ SEL sel = @selector(length);
+ [pool release];
+ std::cout << "Hello, objc++!\n";
+ return 0;
+}