aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/Target/TargetMachineOptionsTest.cpp
blob: 27f8855b47551f3b04b6eff5b44797412f69fa79 (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
62
63
64
65
66
67
68
69
70
71
72
73
//===-- llvm/unittests/Target/TargetMachineOptionsTest.cpp ----------
//-----===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file contains unit tests for the opaque structure describing options
/// for TargetMachine creation via the C API.
///
//===----------------------------------------------------------------------===//

#include "llvm-c/Core.h"
#include "llvm-c/TargetMachine.h"
#include "llvm/Config/llvm-config.h"
#include "gtest/gtest.h"

namespace llvm {

TEST(TargetMachineCTest, TargetMachineOptions) {
  auto *Options = LLVMCreateTargetMachineOptions();

  LLVMTargetMachineOptionsSetCPU(Options, "cortex-a53");
  LLVMTargetMachineOptionsSetFeatures(Options, "+neon");
  LLVMTargetMachineOptionsSetABI(Options, "aapcs");
  LLVMTargetMachineOptionsSetCodeGenOptLevel(Options, LLVMCodeGenLevelNone);
  LLVMTargetMachineOptionsSetRelocMode(Options, LLVMRelocStatic);
  LLVMTargetMachineOptionsSetCodeModel(Options, LLVMCodeModelKernel);

  LLVMDisposeTargetMachineOptions(Options);
}

TEST(TargetMachineCTest, TargetMachineCreation) {
  LLVMInitializeAllTargets();
  LLVMInitializeAllTargetInfos();
  LLVMInitializeAllTargetMCs();

  // Get the default target to keep the test as generic as possible. This may
  // not be a target for which we can generate code; in that case we give up.

  auto *Triple = LLVMGetDefaultTargetTriple();
  if (strlen(Triple) == 0) {
    LLVMDisposeMessage(Triple);
    GTEST_SKIP();
  }

  LLVMTargetRef Target = nullptr;
  char *Error = nullptr;
  if (LLVMGetTargetFromTriple(Triple, &Target, &Error))
    FAIL() << "Failed to create target from default triple (" << Triple
           << "): " << Error;

  ASSERT_NE(Target, nullptr);

  if (!LLVMTargetHasTargetMachine(Target))
    GTEST_SKIP() << "Default target doesn't support code generation";

  // We don't know which target we're creating a machine for, so don't set any
  // non-default options; they might cause fatal errors.

  auto *Options = LLVMCreateTargetMachineOptions();
  auto *TM = LLVMCreateTargetMachineWithOptions(Target, Triple, Options);
  ASSERT_NE(TM, nullptr);

  LLVMDisposeMessage(Triple);
  LLVMDisposeTargetMachineOptions(Options);
  LLVMDisposeTargetMachine(TM);
}

} // namespace llvm