[Lldb-commits] [PATCH] Fix tests broken by OptionValidator changes.

Zachary Turner zturner at google.com
Tue Jul 8 14:38:42 PDT 2014


Sorry, for people that don't use Phab and prefer to do email reviews
instead, I messed up by not including the list in the original email.  So
I'm attaching the patch directly to this mail along with the original
description:

----

Hi tfiala,

Fix tests broken by the OptionValidator changes.

The getopt library has a structure called option (lowercase).  We have a
structure called Option (uppercase).  previously the two structures had
exactly the same definitions, and we were doing a C-style cast of an
Option* to an option*.  C-style casts don't bother to warn you when you
cast to unrelated types, but in the original OptionValidator patch I
modified the definition of Option.

This patch fixes the errors by building an array of option structures and
filling it out the correct way before passing it to the getopt library.

Note: So that the focus remains on the fix for the test failures, this
patch does not include all the content of the original patch which was
reverted.  If this change is approved, it will go in as a single commit
consisting of the original path (which has been reverted) combined with
this patch.

http://reviews.llvm.org/D4425

Files:
  source/Host/common/OptionParser.cpp

Index: source/Host/common/OptionParser.cpp
===================================================================
--- source/Host/common/OptionParser.cpp
+++ source/Host/common/OptionParser.cpp
@@ -9,6 +9,9 @@

 #include "lldb/Host/OptionParser.h"
 #include "lldb/Host/HostGetOpt.h"
+#include "lldb/lldb-private-types.h"
+
+#include <vector>

 using namespace lldb_private;

@@ -36,7 +39,19 @@
                      const Option *longopts,
                      int *longindex)
 {
-    return getopt_long_only(argc, argv, optstring, (const
option*)longopts, longindex);
+    std::vector<option> opts;
+    while (longopts->definition != nullptr)
+    {
+        option opt;
+        opt.flag = longopts->flag;
+        opt.val = longopts->val;
+        opt.name = longopts->definition->long_option;
+        opt.has_arg = longopts->definition->option_has_arg;
+        opts.push_back(opt);
+        ++longopts;
+    }
+    opts.push_back(option());
+    return getopt_long_only(argc, argv, optstring, &opts[0], longindex);
 }

 char*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20140708/2faf1c43/attachment.html>
-------------- next part --------------
diff --git a/source/Host/common/OptionParser.cpp b/source/Host/common/OptionParser.cpp
index 9a69e0e..a91e764 100644
--- a/source/Host/common/OptionParser.cpp
+++ b/source/Host/common/OptionParser.cpp
@@ -1,99 +1,114 @@
 //===-- source/Host/common/OptionParser.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/OptionParser.h"
 #include "lldb/Host/HostGetOpt.h"
+#include "lldb/lldb-private-types.h"
+
+#include <vector>
 
 using namespace lldb_private;
 
 void
 OptionParser::Prepare()
 {
 #ifdef __GLIBC__
     optind = 0;
 #else
     optreset = 1;
     optind = 1;
 #endif
 }
 
 void
 OptionParser::EnableError(bool error)
 {
     opterr = error ? 1 : 0;
 }
 
 int
 OptionParser::Parse (int argc,
                      char * const argv [],
                      const char *optstring,
                      const Option *longopts,
                      int *longindex)
 {
-    return getopt_long_only(argc, argv, optstring, (const option*)longopts, longindex);
+    std::vector<option> opts;
+    while (longopts->definition != nullptr)
+    {
+        option opt;
+        opt.flag = longopts->flag;
+        opt.val = longopts->val;
+        opt.name = longopts->definition->long_option;
+        opt.has_arg = longopts->definition->option_has_arg;
+        opts.push_back(opt);
+        ++longopts;
+    }
+    opts.push_back(option());
+    return getopt_long_only(argc, argv, optstring, &opts[0], longindex);
 }
 
 char*
 OptionParser::GetOptionArgument()
 {
     return optarg;
 }
 
 int
 OptionParser::GetOptionIndex()
 {
     return optind;
 }
 
 int
 OptionParser::GetOptionErrorCause()
 {
     return optopt;
 }
 
 std::string
 OptionParser::GetShortOptionString(struct option *long_options)
 {
     std::string s;
     int i=0;
     bool done = false;
     while (!done)
     {
         if (long_options[i].name    == 0 &&
             long_options[i].has_arg == 0 &&
             long_options[i].flag    == 0 &&
             long_options[i].val     == 0)
         {
             done = true;
         }
         else
         {
             if (long_options[i].flag == NULL &&
                 isalpha(long_options[i].val))
             {
                 s.append(1, (char)long_options[i].val);
                 switch (long_options[i].has_arg)
                 {
                     default:
                     case no_argument:
                         break;
                         
                     case optional_argument:
                         s.append(2, ':');
                         break;
                     case required_argument:
                         s.append(1, ':');
                         break;
                 }
             }
             ++i;
         }
     }
     return s;
 }


More information about the lldb-commits mailing list