1//===- unittests/Passes/PassBuilderBindingsTest.cpp -----------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm-c/Core.h"
10#include "llvm-c/Transforms/PassBuilder.h"
11#include "llvm-c/Types.h"
12#include "gtest/gtest.h"
13#include <string.h>
14
15using namespace llvm;
16
17class PassBuilderCTest : public testing::Test {
18 void SetUp() override {
19 char *Triple = LLVMGetDefaultTargetTriple();
20 if (strlen(s: Triple) == 0) {
21 GTEST_SKIP();
22 LLVMDisposeMessage(Message: Triple);
23 return;
24 }
25 LLVMInitializeAllTargetInfos();
26 char *Err;
27 LLVMTargetRef Target;
28 if (LLVMGetTargetFromTriple(Triple, T: &Target, ErrorMessage: &Err)) {
29 FAIL() << "Failed to create target from default triple (" << Triple
30 << "): " << Err;
31 }
32 TM = LLVMCreateTargetMachine(T: Target, Triple, CPU: "generic", Features: "",
33 Level: LLVMCodeGenLevelDefault, Reloc: LLVMRelocDefault,
34 CodeModel: LLVMCodeModelDefault);
35 LLVMDisposeMessage(Message: Triple);
36 Context = LLVMContextCreate();
37 Module = LLVMModuleCreateWithNameInContext(ModuleID: "test", C: Context);
38 }
39
40 void TearDown() override {
41 char *Triple = LLVMGetDefaultTargetTriple();
42 if (strlen(s: Triple) == 0) {
43 LLVMDisposeMessage(Message: Triple);
44 return; // Skipped, so nothing to tear down
45 }
46 LLVMDisposeMessage(Message: Triple);
47 LLVMDisposeTargetMachine(T: TM);
48 LLVMDisposeModule(M: Module);
49 LLVMContextDispose(C: Context);
50 }
51
52public:
53 LLVMTargetMachineRef TM;
54 LLVMModuleRef Module;
55 LLVMContextRef Context;
56};
57
58TEST_F(PassBuilderCTest, Basic) {
59 LLVMPassBuilderOptionsRef Options = LLVMCreatePassBuilderOptions();
60 LLVMPassBuilderOptionsSetLoopUnrolling(Options, LoopUnrolling: 1);
61 LLVMPassBuilderOptionsSetVerifyEach(Options, VerifyEach: 1);
62 LLVMPassBuilderOptionsSetDebugLogging(Options, DebugLogging: 0);
63 if (LLVMErrorRef E = LLVMRunPasses(M: Module, Passes: "default<O2>", TM, Options)) {
64 char *Msg = LLVMGetErrorMessage(Err: E);
65 LLVMConsumeError(Err: E);
66 LLVMDisposePassBuilderOptions(Options);
67 FAIL() << "Failed to run passes: " << Msg;
68 }
69 LLVMDisposePassBuilderOptions(Options);
70}
71
72TEST_F(PassBuilderCTest, InvalidPassIsError) {
73 LLVMPassBuilderOptionsRef Options = LLVMCreatePassBuilderOptions();
74 LLVMErrorRef E1 = LLVMRunPasses(M: Module, Passes: "", TM, Options);
75 LLVMErrorRef E2 = LLVMRunPasses(M: Module, Passes: "does-not-exist-pass", TM, Options);
76 ASSERT_TRUE(E1);
77 ASSERT_TRUE(E2);
78 LLVMConsumeError(Err: E1);
79 LLVMConsumeError(Err: E2);
80 LLVMDisposePassBuilderOptions(Options);
81}
82

source code of llvm/unittests/Passes/PassBuilderBindings/PassBuilderBindingsTest.cpp