diff options
author | Greg Clayton <gclayton@apple.com> | 2014-07-10 23:33:37 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2014-07-10 23:33:37 +0000 |
commit | 3f19ada88e24008b24a5db20b7f78f5cff525a0b (patch) | |
tree | 04915a68934f0d4791960d62de0ff182ed0a6ac7 /lldb/source/Target/TargetList.cpp | |
parent | 675d401a263572caa66e021630a97b8d9de7efc4 (diff) | |
download | bcm5719-llvm-3f19ada88e24008b24a5db20b7f78f5cff525a0b.tar.gz bcm5719-llvm-3f19ada88e24008b24a5db20b7f78f5cff525a0b.zip |
Cleanup the iOS simulator code.
Fixes include:
- Don't say that "<arch>-apple-ios" is compatible with "<arch>-apple-macosx"
- Fixed DynamicLoaderMacOSXDYLD so specify an architecture that was converted solely from a cputype and subtype, just specify the file + UUID.
- Fixed PlatformiOSSimulator::GetSupportedArchitectureAtIndex() so it returns the correct archs
- Fixed SymbolFileDWARFDebugMap to load .o files correctly by just specifying the architecture without the vendor and OS now that "<arch>-apple-ios" is not compatible with "<arch>-apple-macosx" so we can load .o files correctly for DWARF with debug map
- Fixed the coded in TargetList::CreateTarget() so it does the right thing with an underspecified triple where just the arch is specified.
llvm-svn: 212783
Diffstat (limited to 'lldb/source/Target/TargetList.cpp')
-rw-r--r-- | lldb/source/Target/TargetList.cpp | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/lldb/source/Target/TargetList.cpp b/lldb/source/Target/TargetList.cpp index c4da84fbf8b..fd58af97872 100644 --- a/lldb/source/Target/TargetList.cpp +++ b/lldb/source/Target/TargetList.cpp @@ -85,6 +85,7 @@ TargetList::CreateTarget (Debugger &debugger, ArchSpec platform_arch(arch); + bool prefer_platform_arch = false; if (user_exe_path && user_exe_path[0]) { @@ -104,7 +105,17 @@ TargetList::CreateTarget (Debugger &debugger, { if (platform_arch.IsValid()) { - if (!platform_arch.IsCompatibleMatch(matching_module_spec.GetArchitecture())) + if (platform_arch.IsCompatibleMatch(matching_module_spec.GetArchitecture())) + { + // If the OS or vendor weren't specified, then adopt the module's + // architecture so that the platform matching can be more accurate + if (!platform_arch.TripleOSWasSpecified() || !platform_arch.TripleVendorWasSpecified()) + { + prefer_platform_arch = true; + platform_arch = matching_module_spec.GetArchitecture(); + } + } + else { error.SetErrorStringWithFormat("the specified architecture '%s' is not compatible with '%s' in '%s'", platform_arch.GetTriple().str().c_str(), @@ -116,6 +127,7 @@ TargetList::CreateTarget (Debugger &debugger, else { // Only one arch and none was specified + prefer_platform_arch = true; platform_arch = matching_module_spec.GetArchitecture(); } } @@ -127,19 +139,10 @@ TargetList::CreateTarget (Debugger &debugger, module_spec.GetArchitecture() = arch; if (module_specs.FindMatchingModuleSpec(module_spec, matching_module_spec)) { + prefer_platform_arch = true; platform_arch = matching_module_spec.GetArchitecture(); } } - // Don't just select the first architecture, we want to let the platform select - // the best architecture first when there are multiple archs. -// else -// { -// // No arch specified, select the first arch -// if (module_specs.GetModuleSpecAtIndex(0, matching_module_spec)) -// { -// platform_arch = matching_module_spec.GetArchitecture(); -// } -// } } } } @@ -166,9 +169,18 @@ TargetList::CreateTarget (Debugger &debugger, // current architecture if we have a valid architecture. platform_sp = debugger.GetPlatformList().GetSelectedPlatform (); - if (arch.IsValid() && !platform_sp->IsCompatibleArchitecture(arch, false, &platform_arch)) + if (!prefer_platform_arch && arch.IsValid()) + { + if (!platform_sp->IsCompatibleArchitecture(arch, false, &platform_arch)) + platform_sp = Platform::GetPlatformForArchitecture(arch, &platform_arch); + } + else if (platform_arch.IsValid()) { - platform_sp = Platform::GetPlatformForArchitecture(arch, &platform_arch); + // if "arch" isn't valid, yet "platform_arch" is, it means we have an executable file with + // a single architecture which should be used + ArchSpec fixed_platform_arch; + if (!platform_sp->IsCompatibleArchitecture(platform_arch, false, &fixed_platform_arch)) + platform_sp = Platform::GetPlatformForArchitecture(platform_arch, &fixed_platform_arch); } } |