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 | |
15 | using namespace llvm; |
16 | |
17 | class 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 | |
52 | public: |
53 | LLVMTargetMachineRef TM; |
54 | LLVMModuleRef Module; |
55 | LLVMContextRef Context; |
56 | }; |
57 | |
58 | TEST_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 | |
72 | TEST_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 | |