zturner added a comment.

In https://reviews.llvm.org/D54731#1305183, @labath wrote:

> I think that something like this would go a long way towards solving the 
> problems with lit tests we're having in lldb.
>
> However, the part that is not clear to me is whether it is actually necessary 
> to modify lit (shtest) to achieve this. It seems to me an equivalent effect 
> to the command from the motivating example could be achieved via something 
> like
>
>   RUN: %compile --source=%p/Inputs/foo.cpp --mode=debug --opt=none --link=no 
> --output=%t.o --clean=yes
>
>
> where `%compile` expands to a python script living somewhere in the lldb 
> repository. This script could do the same thing that the implementation of 
> `COMPILE: ` would do, except it would be done in a separate process.
>
> The only downside of that I see is the extra process will incur some 
> overhead, slowing down the testing, but I am not sure if we care about that 
> (or if it would even be measurable). OTOH, the benefits are:
>
> - decreased complexity of lit
> - decreased level of surprise of developers seeing new lit commands
> - easier reproducibility of tests when debugging (just copy paste the 
> `%compile` run-line to rebuild the executable)


I did consider this, and I'm still open to the possibility of doing things this 
way.  Two reasons I chose this route instead are:

1. We have a lot of setup that runs in lit before we ever get to this point, 
and a builder could re-use this.  For example, the environment, any additional 
lit configuration parameters specified on the command line, etc.  We could of 
course pass these in to the `compile.py` script via hidden arguments, so this 
isn't a total blocker, it was just something I thought of.

2. We could re-purpose this machinery for other uses.  For example, I could 
imagine re-writing many lldb inline tests in terms of a custom command prefix.  
For example, here's `test/functionalities/data-formatter/dump_dynamic/main.cpp`:

  class Base {
  public:
    Base () = default;
    virtual int func() { return 1; }
    virtual ~Base() = default;
  };
  
  class Derived : public Base {
  private:
    int m_derived_data;
  public:
    Derived () : Base(), m_derived_data(0x0fedbeef) {}
    virtual ~Derived() = default;
    virtual int func() { return m_derived_data; }
  };
  
  int main (int argc, char const *argv[])
  {
    Base *base = new Derived();
      return 0; //% stream = lldb.SBStream()
      //% base = self.frame().FindVariable("base")
      //% base.SetPreferDynamicValue(lldb.eDynamicDontRunTarget)
      //% base.GetDescription(stream)
      //% if self.TraceOn(): print(stream.GetData())
      //% self.assertTrue(stream.GetData().startswith("(Derived *"))
  }

I could imagine writing this as:

  class Base {
  public:
    Base () = default;
    virtual int func() { return 1; }
    virtual ~Base() = default;
  };
  
  class Derived : public Base {
  private:
    int m_derived_data;
  public:
    Derived () : Base(), m_derived_data(0x0fedbeef) {}
    virtual ~Derived() = default;
    virtual int func() { return m_derived_data; }
  };
  
  int main (int argc, char const *argv[])
  {
    Base *base = new Derived();
      return 0;
  }
  
  //SCRIPT: stream = lldb.SBStream()
  //SCRIPT: base = self.frame().FindVariable("base")
  //SCRIPT: base.SetPreferDynamicValue(lldb.eDynamicDontRunTarget)
  //SCRIPT: base.GetDescription(stream)
  //EXPECT: stream.GetData().startswith("(Derived *"))

where the `lldb` module is loaded in-process similar to how it is with 
`dotest.py`.  (I do wonder if all `lldbinline` tests could actually be 
convereted to lit / FileCheck tests right now, today, using an lldbinit file 
such as:

  script stream = lldb.SBStream()
  script base = self.frame().FindVariable("base")
  script base.SetPreferDynamicValue(lldb.eDynamicDontRunTarget)
  script base.GetDescription(stream)
  script stream.GetData()

and then FileCheck'ing that, but I haven't tried and I haven't investigated 
every single lldbinline test to see if they would all fit into this model.

In any case, the point being that being able to run python code in-process 
opens up a lot of interesting possibilities, considering that's how all the 
dotest tests are written.  Whether we need that flexibility is open for 
discussion though.  Like I said, i'm willing to give the external script a try 
if people think we should try a more conservative approach first.


https://reviews.llvm.org/D54731



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to