[Lldb-commits] [lldb] r182065 - Implement ObjectFileELF::GetModuleSpecifications(), and add PlatformLinux code to deal with unknown arch properties.

Malea, Daniel daniel.malea at intel.com
Thu May 16 17:38:30 PDT 2013


Hey Mike, this commit seems to have caused some issues (at first glance,
related to expression evaluation) on the clang buildbot:

http://lab.llvm.org:8011/builders/lldb-x86_64-debian-clang/builds/3349

Can you take a look?

(BTW, if you're using cmake to build, you can run "[make|ninja]
check-lldb" to run the entire suite, otherwise for the configure build
it's "make -C tools/lldb/test" IIRC)

Thanks,
Dan

On 2013-05-16 8:20 PM, "Michael Sartain" <mikesart at valvesoftware.com>
wrote:

>Author: mikesart
>Date: Thu May 16 19:20:21 2013
>New Revision: 182065
>
>URL: http://llvm.org/viewvc/llvm-project?rev=182065&view=rev
>Log:
>Implement ObjectFileELF::GetModuleSpecifications(), and add PlatformLinux
>code to deal with unknown arch properties.
>
>CR: Greg Clayton
>
>
>Modified:
>    lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
>    lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
>    lldb/trunk/source/Plugins/Platform/Linux/PlatformLinux.cpp
>
>Modified: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
>URL: 
>http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/E
>LF/ObjectFileELF.cpp?rev=182065&r1=182064&r2=182065&view=diff
>==========================================================================
>====
>--- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (original)
>+++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp Thu May 16
>19:20:21 2013
>@@ -222,6 +222,18 @@ ObjectFileELF::CreateMemoryInstance (con
>     return NULL;
> }
> 
>+bool
>+ObjectFileELF::MagicBytesMatch (DataBufferSP& data_sp,
>+                                  lldb::addr_t data_offset,
>+                                  lldb::addr_t data_length)
>+{
>+    if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT +
>data_offset))
>+    {
>+        const uint8_t *magic = data_sp->GetBytes() + data_offset;
>+        return ELFHeader::MagicBytesMatch(magic);
>+    }
>+    return false;
>+}
> 
> size_t
> ObjectFileELF::GetModuleSpecifications (const lldb_private::FileSpec&
>file,
>@@ -231,7 +243,33 @@ ObjectFileELF::GetModuleSpecifications (
>                                         lldb::offset_t length,
>                                         lldb_private::ModuleSpecList
>&specs)
> {
>-    return 0;
>+    const size_t initial_count = specs.GetSize();
>+    
>+    if (ObjectFileELF::MagicBytesMatch(data_sp, 0,
>data_sp->GetByteSize()))
>+    {
>+        DataExtractor data;
>+        data.SetData(data_sp);
>+        elf::ELFHeader header;
>+        if (header.Parse(data, &data_offset))
>+        {
>+            if (data_sp)
>+            {
>+                ModuleSpec spec;
>+                spec.GetFileSpec() = file;
>+                spec.GetArchitecture().SetArchitecture(eArchTypeELF,
>+                                                       header.e_machine,
>+                 
>LLDB_INVALID_CPUTYPE);
>+                if (spec.GetArchitecture().IsValid())
>+                {
>+                    // ObjectFileMachO adds the UUID here also, but that
>isn't in the elf header
>+                    // so we'd have to read the entire file in and
>calculate the md5sum.
>+                    // That'd be bad for this routine...
>+                    specs.Append(spec);
>+                }
>+            }
>+        }
>+    }
>+    return specs.GetSize() - initial_count;
> }
> 
> //------------------------------------------------------------------
>
>Modified: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
>URL: 
>http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/E
>LF/ObjectFileELF.h?rev=182065&r1=182064&r2=182065&view=diff
>==========================================================================
>====
>--- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h (original)
>+++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h Thu May 16
>19:20:21 2013
>@@ -65,6 +65,12 @@ public:
>                              lldb::offset_t file_offset,
>                              lldb::offset_t length,
>                              lldb_private::ModuleSpecList &specs);
>+
>+    static bool
>+    MagicBytesMatch (lldb::DataBufferSP& data_sp,
>+                     lldb::addr_t offset,
>+                     lldb::addr_t length);
>+
>     //------------------------------------------------------------------
>     // PluginInterface protocol
>     //------------------------------------------------------------------
>
>Modified: lldb/trunk/source/Plugins/Platform/Linux/PlatformLinux.cpp
>URL: 
>http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/Lin
>ux/PlatformLinux.cpp?rev=182065&r1=182064&r2=182065&view=diff
>==========================================================================
>====
>--- lldb/trunk/source/Plugins/Platform/Linux/PlatformLinux.cpp (original)
>+++ lldb/trunk/source/Plugins/Platform/Linux/PlatformLinux.cpp Thu May 16
>19:20:21 2013
>@@ -208,6 +208,29 @@ PlatformLinux::ResolveExecutable (const
>                                                  NULL,
>                                                  NULL,
>                                                  NULL);
>+            if (error.Fail())
>+            {
>+                // If we failed, it may be because the vendor and os
>aren't known. If that is the
>+                // case, try setting them to the host architecture and
>give it another try.
>+                llvm::Triple &module_triple =
>module_spec.GetArchitecture().GetTriple();
>+                bool is_vendor_specified = (module_triple.getVendor() !=
>llvm::Triple::UnknownVendor);
>+                bool is_os_specified = (module_triple.getOS() !=
>llvm::Triple::UnknownOS);
>+                if (!is_vendor_specified || !is_os_specified)
>+                {
>+                    const llvm::Triple &host_triple =
>Host::GetArchitecture (Host::eSystemDefaultArchitecture).GetTriple();
>+
>+                    if (!is_vendor_specified)
>+                        module_triple.setVendorName
>(host_triple.getVendorName());
>+                    if (!is_os_specified)
>+                        module_triple.setOSName
>(host_triple.getOSName());
>+
>+                    error = ModuleList::GetSharedModule (module_spec,
>+                                                         exe_module_sp,
>+                                                         NULL,
>+                                                         NULL,
>+                                                         NULL);
>+                }
>+            }
>         
>             // TODO find out why exe_module_sp might be NULL
>             if (!exe_module_sp || exe_module_sp->GetObjectFile() == NULL)
>
>
>_______________________________________________
>lldb-commits mailing list
>lldb-commits at cs.uiuc.edu
>http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits





More information about the lldb-commits mailing list