brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · 4e17b1a Raw
97 lines · cpp
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-exception6//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(Triple) == 0) {21      GTEST_SKIP();22      LLVMDisposeMessage(Triple);23      return;24    }25    LLVMInitializeAllTargetInfos();26    char *Err;27    LLVMTargetRef Target;28    if (LLVMGetTargetFromTriple(Triple, &Target, &Err)) {29      FAIL() << "Failed to create target from default triple (" << Triple30             << "): " << Err;31    }32    TM = LLVMCreateTargetMachine(Target, Triple, "generic", "",33                                 LLVMCodeGenLevelDefault, LLVMRelocDefault,34                                 LLVMCodeModelDefault);35    LLVMDisposeMessage(Triple);36    Context = LLVMContextCreate();37    Module = LLVMModuleCreateWithNameInContext("test", Context);38    LLVMTypeRef FT =39        LLVMFunctionType(LLVMVoidTypeInContext(Context), nullptr, 0, 0);40    Function = LLVMAddFunction(Module, "test", FT);41  }42 43  void TearDown() override {44    char *Triple = LLVMGetDefaultTargetTriple();45    if (strlen(Triple) == 0) {46      LLVMDisposeMessage(Triple);47      return; // Skipped, so nothing to tear down48    }49    LLVMDisposeMessage(Triple);50    LLVMDisposeTargetMachine(TM);51    LLVMDisposeModule(Module);52    LLVMContextDispose(Context);53  }54 55public:56  LLVMTargetMachineRef TM;57  LLVMModuleRef Module;58  LLVMValueRef Function;59  LLVMContextRef Context;60};61 62TEST_F(PassBuilderCTest, Basic) {63  LLVMPassBuilderOptionsRef Options = LLVMCreatePassBuilderOptions();64  LLVMPassBuilderOptionsSetLoopUnrolling(Options, 1);65  LLVMPassBuilderOptionsSetVerifyEach(Options, 1);66  LLVMPassBuilderOptionsSetDebugLogging(Options, 0);67  LLVMPassBuilderOptionsSetAAPipeline(Options, "basic-aa");68  if (LLVMErrorRef E = LLVMRunPasses(Module, "default<O2>", TM, Options)) {69    char *Msg = LLVMGetErrorMessage(E);70    LLVMDisposePassBuilderOptions(Options);71    FAIL() << "Failed to run passes: " << Msg;72  }73  LLVMDisposePassBuilderOptions(Options);74}75 76TEST_F(PassBuilderCTest, InvalidPassIsError) {77  LLVMPassBuilderOptionsRef Options = LLVMCreatePassBuilderOptions();78  LLVMErrorRef E1 = LLVMRunPasses(Module, "", TM, Options);79  LLVMErrorRef E2 = LLVMRunPasses(Module, "does-not-exist-pass", TM, Options);80  ASSERT_TRUE(E1);81  ASSERT_TRUE(E2);82  LLVMConsumeError(E1);83  LLVMConsumeError(E2);84  LLVMDisposePassBuilderOptions(Options);85}86 87TEST_F(PassBuilderCTest, Function) {88  LLVMPassBuilderOptionsRef Options = LLVMCreatePassBuilderOptions();89  if (LLVMErrorRef E =90          LLVMRunPassesOnFunction(Function, "no-op-function", TM, Options)) {91    char *Msg = LLVMGetErrorMessage(E);92    LLVMDisposePassBuilderOptions(Options);93    FAIL() << "Failed to run passes on function: " << Msg;94  }95  LLVMDisposePassBuilderOptions(Options);96}97