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