Home | History | Annotate | Download | only in MCJIT
      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:
     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
     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
     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