[lldb-dev] lldb patches for OpenBSD

Amit Kulkarni amitkulz at gmail.com
Thu Mar 31 20:47:35 PDT 2011


Hi,

I have several small fixes for OpenBSD, I am just compiling lldb, not
at all meaning to run it for now. Please give feedback.

1) C99 discourages LONG_LONG_MAX, ULONG_LONG_MAX, and relatives? Can
this be fixed properly by complete replacement or
you would settle for ifndef in the code? I don't know if it exists on
Mac OSX and Linux, so can you please change appropriately? I have
included a ugly ifndef in a DataExtractor.cpp and DNBDataRef.cpp.

2) File.cpp needs <sys/stat.h> because all the permissions like
S_IRUSR, S_IWUSR, S_IROTH, S_IXOTH etc are defined there in OpenBSD
and FreeBSD (both -current or head sources). I don't have any Linux
sources around but Linux knowledgeable people will correct me, if its
needed there, if not we can add ifndef?

3) DT_WHT won't be defined in <sys/dirent.h> on OpenBSD. In fact, it
was specifically removed.

4) return (uint64_t) (pthread_self()); is a poor hack for getting
thread id in Host.cpp. I hope to correct that in with feedback from
more knowledgeable people here on this board. I privately sent a email
to an OpenBSD developer, Matt Dempsky who wrote.

> llvm/tools/lldb/source/Host/common/Host.cpp:410: error: cast from
> 'pthread*' to 'lldb::tid_t' loses precision

"That's because tid_t is a uint32_t, but on 64-bit arches pthread_t is
a pointer, and so it's a 64-bit value.  It would probably be better to
change tid_t to a uint64_t.  I don't imagine that would be a
controversial change, and it affects all 64-bit non-Apple platforms, I
believe."

Also, is there any interest in convert the Makefiles into CMakeLists.txt?

Thanks,
amit


Index: include/lldb/Host/Config.h
===================================================================
--- include/lldb/Host/Config.h	(revision 128703)
+++ include/lldb/Host/Config.h	(working copy)
@@ -18,7 +18,7 @@

 #include "lldb/Host/linux/Config.h"

-#elif defined(__FreeBSD__)
+#elif defined(__FreeBSD__) || defined(__OpenBSD__)

 #include "lldb/Host/freebsd/Config.h"

Index: source/Expression/DWARFExpression.cpp
===================================================================
--- source/Expression/DWARFExpression.cpp	(revision 128703)
+++ source/Expression/DWARFExpression.cpp	(working copy)
@@ -2175,9 +2175,9 @@
                 stack.pop_back();

                 Scalar &index_scalar =
index_val.ResolveValue(exe_ctx, ast_context);
-                int64_t index = index_scalar.SLongLong(LONG_LONG_MAX);
+                int64_t index = index_scalar.SLongLong(LLONG_MAX);

-                if (index == LONG_LONG_MAX)
+                if (index == LLONG_MAX)
                 {
                     if (error_ptr)
                         error_ptr->SetErrorString("Invalid array index.");
Index: source/Symbol/ClangASTContext.cpp
===================================================================
--- source/Symbol/ClangASTContext.cpp	(revision 128703)
+++ source/Symbol/ClangASTContext.cpp	(working copy)
@@ -4266,7 +4266,7 @@
         if (member_type)
             *member_type =
cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
         if (size)
-            *size =
cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX);
+            *size =
cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
         return true;
     case clang::Type::IncompleteArray:
         if (member_type)
Index: source/Core/DataExtractor.cpp
===================================================================
--- source/Core/DataExtractor.cpp	(revision 128703)
+++ source/Core/DataExtractor.cpp	(working copy)
@@ -886,6 +886,11 @@
 uint64_t
 DataExtractor::GetGNUEHPointer (uint32_t *offset_ptr, uint32_t
eh_ptr_enc, lldb::addr_t pc_rel_addr, lldb::addr_t text_addr,
lldb::addr_t data_addr)//, BSDRelocs *data_relocs) const
 {
+
+#ifndef ULONG_LONG_MAX
+#define ULONG_LONG_MAX ULLONG_MAX
+#endif
+
     if (eh_ptr_enc == DW_EH_PE_omit)
         return ULONG_LONG_MAX;  // Value isn't in the buffer...

Index: source/Host/common/File.cpp
===================================================================
--- source/Host/common/File.cpp	(revision 128703)
+++ source/Host/common/File.cpp	(working copy)
@@ -12,6 +12,7 @@

 #include <fcntl.h>
 #include <stdarg.h>
+#include <sys/stat.h>

 #include "lldb/Core/Error.h"
 #include "lldb/Host/Config.h"
Index: source/Host/common/FileSpec.cpp
===================================================================
--- source/Host/common/FileSpec.cpp	(revision 128703)
+++ source/Host/common/FileSpec.cpp	(working copy)
@@ -904,7 +904,9 @@
                 case DT_REG:        file_type = eFileTypeRegular;
  call_callback = find_files;         break;
                 case DT_LNK:        file_type =
eFileTypeSymbolicLink;  call_callback = find_other;         break;
                 case DT_SOCK:       file_type = eFileTypeSocket;
  call_callback = find_other;         break;
+#if !defined(__OpenBSD__)
                 case DT_WHT:        file_type = eFileTypeOther;
  call_callback = find_other;         break;
+#endif
                 }

                 if (call_callback)
Index: source/Host/common/Host.cpp
===================================================================
--- source/Host/common/Host.cpp	(revision 128703)
+++ source/Host/common/Host.cpp	(working copy)
@@ -37,9 +37,8 @@
 #include <mach-o/dyld.h>
 #include <sys/sysctl.h>

+#elif defined (__linux__) || defined (__OpenBSD__)

-#elif defined (__linux__)
-
 #include <sys/wait.h>

 #endif
@@ -409,6 +408,8 @@
 {
 #if defined (__APPLE__)
     return ::mach_thread_self();
+#elif defined (__OpenBSD__)
+    return (uint64_t) (pthread_self());
 #else
     return lldb::tid_t(pthread_self());
 #endif
Index: tools/debugserver/source/DNBDataRef.cpp
===================================================================
--- tools/debugserver/source/DNBDataRef.cpp	(revision 128703)
+++ tools/debugserver/source/DNBDataRef.cpp	(working copy)
@@ -206,6 +206,11 @@
 uint64_t
 DNBDataRef::GetDwarfEHPtr(offset_t *offset_ptr, uint32_t encoding) const
 {
+
+#ifndef ULONG_LONG_MAX
+#define ULONG_LONG_MAX ULLONG_MAX
+#endif
+
     if (encoding == DW_EH_PE_omit)
         return ULONG_LONG_MAX;    // Value isn't in the buffer...



More information about the lldb-dev mailing list