summaryrefslogtreecommitdiffstats
path: root/lld/unittests/DriverTests/DriverTest.h
blob: 65af7cac3139db19b84a4466d56e62f0ee167ac0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//===- lld/unittest/DriverTest.h ------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lld/Driver/Driver.h"
#include "llvm/Support/raw_ostream.h"
#include "gtest/gtest.h"
#include <stdarg.h>

namespace {

using namespace llvm;
using namespace lld;

template<typename D, typename T>
class ParserTest : public testing::Test {
protected:

  virtual const LinkingContext *linkingContext() = 0;

  std::string &errorMessage() { return  _errorMessage; }

  // Convenience method for getting number of input files.
  int inputFileCount() {
    return linkingContext()->getNodes().size();
  }

  // Convenience method for getting i'th input files name.
  std::string inputFile(int index) {
    Node &node = *linkingContext()->getNodes()[index];
    if (node.kind() == Node::Kind::File)
      return cast<FileNode>(&node)->getFile()->path();
    llvm_unreachable("not handling other types of input files");
  }

  // For unit tests to call driver with various command lines.
  bool parse(const char *args, ...) {
    // Construct command line options from varargs.
    std::vector<const char *> vec;
    vec.push_back(args);
    va_list ap;
    va_start(ap, args);
    while (const char *arg = va_arg(ap, const char *))
      vec.push_back(arg);
    va_end(ap);

    // Call the parser.
    raw_string_ostream os(_errorMessage);
    return D::parse(vec, _ctx, os);
  }

  T _ctx;
  std::string _errorMessage;
};

}
OpenPOWER on IntegriCloud