| //===-- 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 |