[Lldb-commits] [lldb] r199510 - Enable Linux distribution in vendor portion of host triple.
Todd Fiala
tfiala at google.com
Fri Jan 17 14:32:38 PST 2014
Done.
On Fri, Jan 17, 2014 at 1:53 PM, Todd Fiala <tfiala at google.com> wrote:
> Yep - on it.
>
> I'll adjust.
>
>
> On Fri, Jan 17, 2014 at 12:56 PM, Greg Clayton <gclayton at apple.com> wrote:
>
>> A few comments below...
>>
>> On Jan 17, 2014, at 12:18 PM, Todd Fiala <tfiala at google.com> wrote:
>>
>> > Author: tfiala
>> > Date: Fri Jan 17 14:18:59 2014
>> > New Revision: 199510
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=199510&view=rev
>> > Log:
>> > Enable Linux distribution in vendor portion of host triple.
>> >
>> > This change does the following:
>> >
>> > * enables building lldb-gdbserver on linux_x86-64 platforms.
>> >
>> > Note - it builds but it has several run-time issues where many gdb
>> > remote protocol features are not properly implemented yet. I'm
>> > working on these one at a time.
>> >
>> > * lldb-gdbserver: does not enable the eLaunchFlagDebug launch flag on
>> > Linux. Currently the POSIX launch routine will assert if that flag
>> > is passed in, presumably because that launch mode is not yet
>> > available. This prevents lldb-gdbserver from asserting the moment
>> > it launches the debuggee process.
>> >
>> > * Adds ConstString& Host::GetDistributionId ()
>> >
>> > This method is defined to return an empty result on all platforms
>> > except for Linux. On Linux, it makes one attempt to execute
>> > 'lsb_release -i' (both /usr/bin/lsb_release, where it appears
>> > on ubuntu, and /bin/lsb_release, where it appears on fedora
>> > if the redhat-lsb package is installed). If lsb_release is not
>> > found in either of those locations, or if 'lsb_release -i' does
>> > not return the first line starting with "Distributor ID:\t",
>> > then the distribution id is empty. The method will lower-case
>> > the id and replace whitespace with underscores.
>>
>> Can this be launched with "/usr/bin/env lsb_release"? Would that make it
>> work on both systems with no differences?
>>
>> > * Modify Host::GetArchitecture () so that linux replaces an unknown
>> > vendor portion with the results of GetDistributionId () if that
>> > is non-empty. This shows up now in qHostInfo remote packet
>> > responses and on the lldb host side. Tested with ubuntu and
>> > fedora (the latter both with the default of not having lsb_release
>> > installed, and with having lsb_release installed via the redhat-lsb
>> > package).
>> >
>> > Examples of triples on Linux after this change:
>> >
>> > # x86_64 Unbuntu 12.04 LTS:
>> > x86_64-ubuntu-linux-gnu
>> >
>> > # x86_64 Fedora 20 Desktop with redhat-lsb package installed
>> > x86_64-fedora-linux-gnu
>> >
>> > # x86_64 Fedora 20 Desktop without redhat-lsb-core installed
>> > # (i.e. no /bin/lsb_release available)
>> > # same as before the change
>> > x86_64--linux-gnu
>> >
>> > Note I intend to have Android respond with:
>> >
>> > {arch}-android-linux
>> >
>> > when I get to implementing Android lldb-gdbserver support.
>>
>> We need to be careful with making new target triples as these target
>> triples must be consumable by clang and LLVM. I would avoid changing the
>> triples in any way that doesn't play well with clang. A few possible work
>> arounds:
>>
>> 1 - Modify ArchSpec to also be able to have a Distribution inside of it
>> and then we use ArchSpec when we need to get the distro ID.
>> 2 - Modify the llvm::Triple class to be able to include the distribution
>> and deal with it there
>>
>>
>> >
>> > Modified:
>> > lldb/trunk/include/lldb/Host/Host.h
>> > lldb/trunk/source/Host/common/Host.cpp
>> > lldb/trunk/source/Host/linux/Host.cpp
>> > lldb/trunk/tools/Makefile
>> > lldb/trunk/tools/lldb-gdbserver/lldb-gdbserver.cpp
>> >
>> > Modified: lldb/trunk/include/lldb/Host/Host.h
>> > URL:
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Host.h?rev=199510&r1=199509&r2=199510&view=diff
>> >
>> ==============================================================================
>> > --- lldb/trunk/include/lldb/Host/Host.h (original)
>> > +++ lldb/trunk/include/lldb/Host/Host.h Fri Jan 17 14:18:59 2014
>> > @@ -202,6 +202,23 @@ public:
>> > GetTargetTriple ();
>> >
>> > //------------------------------------------------------------------
>> > + /// Gets the name of the distribution (i.e. distributor id).
>> > + ///
>> > + /// On Linux, this will return the equivalent of lsb_release -i.
>> > + /// Android will return 'android'. Other systems may return
>> > + /// nothing.
>> > + ///
>> > + /// @return
>> > + /// A ConstString reference containing the OS distribution id.
>> > + /// The return string will be all lower case, with whitespace
>> > + /// replaced with underscores. The return string will be
>> > + /// empty (result.AsCString() will return NULL) if the
>> distribution
>> > + /// cannot be obtained.
>> > +
>> //------------------------------------------------------------------
>> > + static const ConstString &
>> > + GetDistributionId ();
>> > +
>> > +
>> //------------------------------------------------------------------
>> > /// Get the process ID for the calling process.
>> > ///
>> > /// @return
>> >
>> > Modified: lldb/trunk/source/Host/common/Host.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Host.cpp?rev=199510&r1=199509&r2=199510&view=diff
>> >
>> ==============================================================================
>> > --- lldb/trunk/source/Host/common/Host.cpp (original)
>> > +++ lldb/trunk/source/Host/common/Host.cpp Fri Jan 17 14:18:59 2014
>> > @@ -368,7 +368,13 @@ Host::GetArchitecture (SystemDefaultArch
>> > // If the OS is Linux, "unknown" in the vendor slot isn't what
>> we want
>> > // for the default triple. It's probably an artifact of
>> config.guess.
>> > if (triple.getOS() == llvm::Triple::Linux && triple.getVendor()
>> == llvm::Triple::UnknownVendor)
>> > - triple.setVendorName("");
>> > + {
>> > + const char *const dist_c_str = GetDistributionId
>> ().AsCString ();
>> > + if (dist_c_str)
>> > + triple.setVendorName (dist_c_str);
>> > + else
>> > + triple.setVendorName ("");
>> > + }
>> >
>> > switch (triple.getArch())
>> > {
>> > @@ -446,6 +452,19 @@ Host::GetTargetTriple()
>> > return g_host_triple;
>> > }
>> >
>> > +// See linux/Host.cpp for Linux-based implementations of this.
>> > +// Add your platform-specific implementation to the appropriate host
>> file.
>> > +#if !defined(__linux__)
>> > +
>> > +const ConstString &
>> > + Host::GetDistributionId ()
>> > +{
>> > + static ConstString s_distribution_id;
>> > + return s_distribution_id;
>> > +}
>> > +
>> > +#endif // #if !defined(__linux__)
>> > +
>> > lldb::pid_t
>> > Host::GetCurrentProcessID()
>> > {
>> >
>> > Modified: lldb/trunk/source/Host/linux/Host.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/linux/Host.cpp?rev=199510&r1=199509&r2=199510&view=diff
>> >
>> ==============================================================================
>> > --- lldb/trunk/source/Host/linux/Host.cpp (original)
>> > +++ lldb/trunk/source/Host/linux/Host.cpp Fri Jan 17 14:18:59 2014
>> > @@ -20,6 +20,7 @@
>> > // Other libraries and framework includes
>> > // Project includes
>> > #include "lldb/Core/Error.h"
>> > +#include "lldb/Core/Log.h"
>> > #include "lldb/Target/Process.h"
>> >
>> > #include "lldb/Host/Host.h"
>> > @@ -494,3 +495,114 @@ Host::GetEnvironment (StringList &env)
>> > env.AppendString(env_entry);
>> > return i;
>> > }
>> > +
>> > +const ConstString &
>> > +Host::GetDistributionId ()
>> > +{
>> > + // Try to run 'lbs_release -i', and use that response
>> > + // for the distribution id.
>> > +
>> > + static bool s_evaluated;
>> > + static ConstString s_distribution_id;
>> > +
>> > + if (!s_evaluated)
>> > + {
>> > + s_evaluated = true;
>> > +
>> > + Log *log(lldb_private::GetLogIfAllCategoriesSet
>> (LIBLLDB_LOG_HOST));
>> > + if (log)
>> > + log->Printf ("attempting to determine Linux
>> distribution...");
>> > +
>> > + // check if the lsb_release command exists at one of the
>> > + // following paths
>> > + const char *const exe_paths[] = {
>> > + "/bin/lsb_release",
>> > + "/usr/bin/lsb_release"
>> > + };
>> > +
>> > + for (int exe_index = 0;
>> > + exe_index < sizeof (exe_paths) / sizeof (exe_paths[0]);
>> > + ++exe_index)
>> > + {
>> > + const char *const get_distribution_info_exe =
>> exe_paths[exe_index];
>> > + if (access (get_distribution_info_exe, F_OK))
>> > + {
>> > + // this exe doesn't exist, move on to next exe
>> > + if (log)
>> > + log->Printf ("executable doesn't exist: %s",
>> > + get_distribution_info_exe);
>> > + continue;
>> > + }
>> > +
>> > + // execute the distribution-retrieval command, read output
>> > + std::string get_distribution_id_command
>> (get_distribution_info_exe);
>> > + get_distribution_id_command += " -i";
>> > +
>> > + FILE *file = popen (get_distribution_id_command.c_str (),
>> "r");
>> > + if (!file)
>> > + {
>> > + if (log)
>> > + log->Printf (
>> > + "failed to run command: \"%s\", cannot
>> retrieve "
>> > + "platform information",
>> > + get_distribution_id_command.c_str ());
>> > + return s_distribution_id;
>> > + }
>> > +
>> > + // retrieve the distribution id string.
>> > + char distribution_id[256] = { '\0' };
>> > + if (fgets (distribution_id, sizeof (distribution_id) - 1,
>> file)
>> > + != NULL)
>> > + {
>> > + if (log)
>> > + log->Printf ("distribution id command returned
>> \"%s\"",
>> > + distribution_id);
>> > +
>> > + const char *const distributor_id_key = "Distributor
>> ID:\t";
>> > + if (strstr (distribution_id, distributor_id_key))
>> > + {
>> > + // strip newlines
>> > + std::string id_string (distribution_id +
>> > + strlen (distributor_id_key));
>> > + id_string.erase(
>> > + std::remove (
>> > + id_string.begin (),
>> > + id_string.end (),
>> > + '\n'),
>> > + id_string.end ());
>> > +
>> > + // lower case it and convert whitespace to
>> underscores
>> > + std::transform (
>> > + id_string.begin(),
>> > + id_string.end (),
>> > + id_string.begin (),
>> > + [] (char ch)
>> > + { return tolower ( isspace (ch) ? '_' : ch );
>> });
>> > +
>> > + s_distribution_id.SetCString (id_string.c_str ());
>> > + if (log)
>> > + log->Printf ("distribion id set to \"%s\"",
>> > + s_distribution_id.GetCString ());
>> > + }
>> > + else
>> > + {
>> > + if (log)
>> > + log->Printf ("failed to find \"%s\" field in
>> \"%s\"",
>> > + distributor_id_key, distribution_id);
>> > + }
>> > + }
>> > + else
>> > + {
>> > + if (log)
>> > + log->Printf (
>> > + "failed to retrieve distribution id, \"%s\"
>> returned no"
>> > + " lines", get_distribution_id_command.c_str
>> ());
>> > + }
>> > +
>> > + // clean up the file
>> > + pclose(file);
>> > + }
>> > + }
>> > +
>> > + return s_distribution_id;
>> > +}
>> >
>> > Modified: lldb/trunk/tools/Makefile
>> > URL:
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/Makefile?rev=199510&r1=199509&r2=199510&view=diff
>> >
>> ==============================================================================
>> > --- lldb/trunk/tools/Makefile (original)
>> > +++ lldb/trunk/tools/Makefile Fri Jan 17 14:18:59 2014
>> > @@ -1,18 +1,27 @@
>> > ##===- source/Makefile -------------------------------------*- Makefile
>> -*-===##
>> > -#
>> > +#
>> > # The LLVM Compiler Infrastructure
>> > #
>> > # This file is distributed under the University of Illinois Open Source
>> > # License. See LICENSE.TXT for details.
>> > -#
>> > +#
>> >
>> ##===----------------------------------------------------------------------===##
>> >
>> > LLDB_LEVEL := ..
>> > include $(LLDB_LEVEL)/../../Makefile.config
>> >
>> > -# tfiala test commit: will include lldb-gdbserver for linux x86_64
>> soon.
>> > +# enable lldb-gdbserver for supported platforms
>> > +DIRS :=
>> > +ifneq (,$(strip $(filter $(HOST_OS), Linux)))
>> > +ifneq (,$(strip $(filter $(HOST_ARCH), x86_64)))
>> > +DIRS += lldb-gdbserver
>> > +else
>> > +endif
>> > +else
>> > +endif
>> > +
>> > ifneq ($(HOST_OS),MingW)
>> > -DIRS := driver lldb-platform
>> > +DIRS += driver lldb-platform
>> > endif
>> >
>> > include $(LLDB_LEVEL)/Makefile
>> >
>> > Modified: lldb/trunk/tools/lldb-gdbserver/lldb-gdbserver.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-gdbserver/lldb-gdbserver.cpp?rev=199510&r1=199509&r2=199510&view=diff
>> >
>> ==============================================================================
>> > --- lldb/trunk/tools/lldb-gdbserver/lldb-gdbserver.cpp (original)
>> > +++ lldb/trunk/tools/lldb-gdbserver/lldb-gdbserver.cpp Fri Jan 17
>> 14:18:59 2014
>> > @@ -188,7 +188,7 @@ main (int argc, char *argv[])
>> > display_usage(progname);
>> > exit(255);
>> > }
>> > -
>> > +
>> > const char *host_and_port = argv[0];
>> > argc -= 1;
>> > argv += 1;
>> > @@ -199,9 +199,15 @@ main (int argc, char *argv[])
>> > {
>> > // Launch the program specified on the command line
>> > launch_info.SetArguments((const char **)argv, true);
>> > - launch_info.GetFlags().Set(eLaunchFlagDebug |
>> eLaunchFlagStopAtEntry);
>> > +
>> > + unsigned int launch_flags = eLaunchFlagStopAtEntry;
>> > +#if !defined(__linux__)
>> > + // linux doesn't yet handle eLaunchFlagDebug
>> > + launch_flags |= eLaunchFlagDebug;
>> > +#endif
>> > + launch_info.GetFlags ().Set (launch_flags);
>> > error = Host::LaunchProcess (launch_info);
>> > -
>> > +
>> > if (error.Success())
>> > {
>> > printf ("Launched '%s' as process %" PRIu64 "...\n",
>> argv[0], launch_info.GetProcessID());
>> >
>> >
>> > _______________________________________________
>> > lldb-commits mailing list
>> > lldb-commits at cs.uiuc.edu
>> > http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
>>
>>
>
>
> --
> Todd Fiala | Software Engineer | tfiala at google.com | 650-943-3180
>
--
Todd Fiala | Software Engineer | tfiala at google.com | 650-943-3180
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20140117/0290634f/attachment.html>
More information about the lldb-commits
mailing list