• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- MCJITTestBase.h - Common base class for MCJIT Unit tests  ----------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This class implements functionality shared by both MCJIT C API tests, and
11 // the C++ API tests.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_UNITTESTS_EXECUTIONENGINE_MCJIT_MCJITTESTAPICOMMON_H
16 #define LLVM_UNITTESTS_EXECUTIONENGINE_MCJIT_MCJITTESTAPICOMMON_H
17 
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/ADT/Triple.h"
20 #include "llvm/IR/LegacyPassManager.h"
21 #include "llvm/InitializePasses.h"
22 #include "llvm/Support/Host.h"
23 #include "llvm/Support/TargetSelect.h"
24 
25 // Used to skip tests on unsupported architectures and operating systems.
26 // To skip a test, add this macro at the top of a test-case in a suite that
27 // inherits from MCJITTestBase. See MCJITTest.cpp for examples.
28 #define SKIP_UNSUPPORTED_PLATFORM \
29   do \
30     if (!ArchSupportsMCJIT() || !OSSupportsMCJIT()) \
31       return; \
32   while(0)
33 
34 namespace llvm {
35 
36 class MCJITTestAPICommon {
37 protected:
MCJITTestAPICommon()38   MCJITTestAPICommon()
39     : HostTriple(sys::getProcessTriple())
40   {
41     InitializeNativeTarget();
42     InitializeNativeTargetAsmPrinter();
43 
44     // FIXME: It isn't at all clear why this is necesasry, but without it we
45     // fail to initialize the AssumptionCacheTracker.
46     initializeAssumptionCacheTrackerPass(*PassRegistry::getPassRegistry());
47 
48 #ifdef LLVM_ON_WIN32
49     // On Windows, generate ELF objects by specifying "-elf" in triple
50     HostTriple += "-elf";
51 #endif // LLVM_ON_WIN32
52     HostTriple = Triple::normalize(HostTriple);
53   }
54 
55   /// Returns true if the host architecture is known to support MCJIT
ArchSupportsMCJIT()56   bool ArchSupportsMCJIT() {
57     Triple Host(HostTriple);
58     // If ARCH is not supported, bail
59     if (std::find(SupportedArchs.begin(), SupportedArchs.end(), Host.getArch())
60         == SupportedArchs.end())
61       return false;
62 
63     // If ARCH is supported and has no specific sub-arch support
64     if (std::find(HasSubArchs.begin(), HasSubArchs.end(), Host.getArch())
65         == HasSubArchs.end())
66       return true;
67 
68     // If ARCH has sub-arch support, find it
69     SmallVectorImpl<std::string>::const_iterator I = SupportedSubArchs.begin();
70     for(; I != SupportedSubArchs.end(); ++I)
71       if (Host.getArchName().startswith(I->c_str()))
72         return true;
73 
74     return false;
75   }
76 
77   /// Returns true if the host OS is known to support MCJIT
OSSupportsMCJIT()78   bool OSSupportsMCJIT() {
79     Triple Host(HostTriple);
80 
81     if (std::find(UnsupportedEnvironments.begin(), UnsupportedEnvironments.end(),
82                   Host.getEnvironment()) != UnsupportedEnvironments.end())
83       return false;
84 
85     if (std::find(UnsupportedOSs.begin(), UnsupportedOSs.end(), Host.getOS())
86         == UnsupportedOSs.end())
87       return true;
88 
89     return false;
90   }
91 
92   std::string HostTriple;
93   SmallVector<Triple::ArchType, 4> SupportedArchs;
94   SmallVector<Triple::ArchType, 1> HasSubArchs;
95   SmallVector<std::string, 2> SupportedSubArchs; // We need to own the memory
96   SmallVector<Triple::OSType, 4> UnsupportedOSs;
97   SmallVector<Triple::EnvironmentType, 1> UnsupportedEnvironments;
98 };
99 
100 } // namespace llvm
101 
102 #endif
103 
104