Preliminary NetBSD support

Summary:
This adds platform code without the cmake/gmake glue to the existing infrastructure.

The missing and incompatibility ptrace(2) bits (existing in FreeBSD) are under active research and development and will be submitted once verified to work.

This code was tested to build and run on NetBSD-current/amd64.

Proper build scripts will be integrated separately as a new commit.

Reviewers: joerg

Subscribers: tfiala, brucem, labath, emaste, lldb-commits

Differential Revision: http://reviews.llvm.org/D13334

llvm-svn: 250146
diff --git a/lldb/source/Host/netbsd/HostInfoNetBSD.cpp b/lldb/source/Host/netbsd/HostInfoNetBSD.cpp
new file mode 100644
index 0000000..aadda76
--- /dev/null
+++ b/lldb/source/Host/netbsd/HostInfoNetBSD.cpp
@@ -0,0 +1,112 @@
+//===-- HostInfoNetBSD.cpp -------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Host/netbsd/HostInfoNetBSD.h"
+
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <sys/utsname.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <inttypes.h>
+
+
+using namespace lldb_private;
+
+uint32_t
+HostInfoNetBSD::GetMaxThreadNameLength()
+{
+    return PTHREAD_MAX_NAMELEN_NP;
+}
+
+bool
+HostInfoNetBSD::GetOSVersion(uint32_t &major, uint32_t &minor, uint32_t &update)
+{
+    struct utsname un;
+
+    ::memset(&un, 0, sizeof(un));
+    if (::uname(&un) < 0)
+        return false;
+
+    /* Accept versions like 7.99.21 and 6.1_STABLE */
+    int status = ::sscanf(un.release, "%" PRIu32 ".%" PRIu32 ".%" PRIu32, &major, &minor, &update);
+    switch(status) {
+    case 0:
+        return false;
+    case 1:
+        minor = 0;
+        /* FALLTHROUGH */
+    case 2:
+        update = 0;
+        /* FALLTHROUGH */
+    case 3:
+    default:
+        return true;
+    }
+}
+
+bool
+HostInfoNetBSD::GetOSBuildString(std::string &s)
+{
+    int mib[2] = {CTL_KERN, KERN_OSREV};
+    char osrev_str[12];
+    int osrev = 0;
+    size_t osrev_len = sizeof(osrev);
+
+    if (::sysctl(mib, 2, &osrev, &osrev_len, NULL, 0) == 0)
+    {
+        ::snprintf(osrev_str, sizeof(osrev_str), "%-10.10d", osrev);
+        s.assign(osrev_str);
+        return true;
+    }
+
+    s.clear();
+    return false;
+}
+
+bool
+HostInfoNetBSD::GetOSKernelDescription(std::string &s)
+{
+    struct utsname un;
+
+    ::memset(&un, 0, sizeof(un));
+    s.clear();
+
+    if (::uname(&un) < 0)
+        return false;
+
+    s.assign(un.version);
+
+    return true;
+}
+
+FileSpec
+HostInfoNetBSD::GetProgramFileSpec()
+{
+    static FileSpec g_program_filespec;
+
+    if (!g_program_filespec)
+    {
+        ssize_t len;
+        static char buf[PATH_MAX];
+        char name[PATH_MAX];
+
+        ::snprintf(name, PATH_MAX, "/proc/%d/exe", ::getpid());
+        len = ::readlink(name, buf, PATH_MAX - 1);
+        if (len != -1)
+        {
+            buf[len] = '\0';
+            g_program_filespec.SetFile(buf, false);
+        }
+    }
+    return g_program_filespec;
+}