From a60ec05fdc1bf51c6d96fa60876be2c8e2aa1b1e Mon Sep 17 00:00:00 2001 From: Corey Farwell Date: Sun, 14 Feb 2016 22:57:43 -0500 Subject: [PATCH] Add LLVM FunctionPass regression test using run-make. Part of https://github.com/rust-lang/rust/issues/31185. Similar to https://github.com/rust-lang/rust/pull/31391. --- src/test/run-make/llvm-module-pass/Makefile | 14 ----- src/test/run-make/llvm-pass/Makefile | 17 ++++++ .../llvm-pass/llvm-function-pass.so.cc | 56 +++++++++++++++++++ .../llvm-module-pass.so.cc} | 2 +- .../{llvm-module-pass => llvm-pass}/main.rs | 0 .../{llvm-module-pass => llvm-pass}/plugin.rs | 6 +- 6 files changed, 78 insertions(+), 17 deletions(-) delete mode 100644 src/test/run-make/llvm-module-pass/Makefile create mode 100644 src/test/run-make/llvm-pass/Makefile create mode 100644 src/test/run-make/llvm-pass/llvm-function-pass.so.cc rename src/test/run-make/{llvm-module-pass/llvm-pass.so.cc => llvm-pass/llvm-module-pass.so.cc} (96%) rename src/test/run-make/{llvm-module-pass => llvm-pass}/main.rs (100%) rename src/test/run-make/{llvm-module-pass => llvm-pass}/plugin.rs (77%) diff --git a/src/test/run-make/llvm-module-pass/Makefile b/src/test/run-make/llvm-module-pass/Makefile deleted file mode 100644 index 93c7c4f5001..00000000000 --- a/src/test/run-make/llvm-module-pass/Makefile +++ /dev/null @@ -1,14 +0,0 @@ --include ../tools.mk - -# Windows doesn't correctly handle include statements with escaping paths, -# so this test will not get run on Windows. -ifdef IS_WINDOWS -all: -else -all: $(call NATIVE_STATICLIB,llvm-pass) - $(RUSTC) plugin.rs -C prefer-dynamic - $(RUSTC) main.rs - -$(TMPDIR)/libllvm-pass.o: - $(CXX) $(CFLAGS) $(LLVM_CXXFLAGS) -c llvm-pass.so.cc -o $(TMPDIR)/libllvm-pass.o -endif diff --git a/src/test/run-make/llvm-pass/Makefile b/src/test/run-make/llvm-pass/Makefile new file mode 100644 index 00000000000..aab6e895f22 --- /dev/null +++ b/src/test/run-make/llvm-pass/Makefile @@ -0,0 +1,17 @@ +-include ../tools.mk + +# Windows doesn't correctly handle include statements with escaping paths, +# so this test will not get run on Windows. +ifdef IS_WINDOWS +all: +else +all: $(call NATIVE_STATICLIB,llvm-function-pass) $(call NATIVE_STATICLIB,llvm-module-pass) + $(RUSTC) plugin.rs -C prefer-dynamic + $(RUSTC) main.rs + +$(TMPDIR)/libllvm-function-pass.o: + $(CXX) $(CFLAGS) $(LLVM_CXXFLAGS) -c llvm-function-pass.so.cc -o $(TMPDIR)/libllvm-function-pass.o + +$(TMPDIR)/libllvm-module-pass.o: + $(CXX) $(CFLAGS) $(LLVM_CXXFLAGS) -c llvm-module-pass.so.cc -o $(TMPDIR)/libllvm-module-pass.o +endif diff --git a/src/test/run-make/llvm-pass/llvm-function-pass.so.cc b/src/test/run-make/llvm-pass/llvm-function-pass.so.cc new file mode 100644 index 00000000000..4470c400760 --- /dev/null +++ b/src/test/run-make/llvm-pass/llvm-function-pass.so.cc @@ -0,0 +1,56 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#include +#include +#include + +#include "llvm/Pass.h" +#include "llvm/IR/Function.h" + +using namespace llvm; + +namespace { + + class TestLLVMPass : public FunctionPass { + + public: + + static char ID; + TestLLVMPass() : FunctionPass(ID) { } + + bool runOnFunction(Function &F) override; + + const char *getPassName() const override { + return "Some LLVM pass"; + } + + }; + +} + +bool TestLLVMPass::runOnFunction(Function &F) { + // A couple examples of operations that previously caused segmentation faults + // https://github.com/rust-lang/rust/issues/31067 + + for (auto N = F.begin(); N != F.end(); ++N) { + /* code */ + } + + LLVMContext &C = F.getContext(); + IntegerType *Int8Ty = IntegerType::getInt8Ty(C); + PointerType::get(Int8Ty, 0); + return true; +} + +char TestLLVMPass::ID = 0; + +static RegisterPass RegisterAFLPass( + "some-llvm-function-pass", "Some LLVM pass"); diff --git a/src/test/run-make/llvm-module-pass/llvm-pass.so.cc b/src/test/run-make/llvm-pass/llvm-module-pass.so.cc similarity index 96% rename from src/test/run-make/llvm-module-pass/llvm-pass.so.cc rename to src/test/run-make/llvm-pass/llvm-module-pass.so.cc index 06b0d6c300c..510375a5e66 100644 --- a/src/test/run-make/llvm-module-pass/llvm-pass.so.cc +++ b/src/test/run-make/llvm-pass/llvm-module-pass.so.cc @@ -52,4 +52,4 @@ bool TestLLVMPass::runOnModule(Module &M) { char TestLLVMPass::ID = 0; static RegisterPass RegisterAFLPass( - "some-llvm-pass", "Some LLVM pass"); + "some-llvm-module-pass", "Some LLVM pass"); diff --git a/src/test/run-make/llvm-module-pass/main.rs b/src/test/run-make/llvm-pass/main.rs similarity index 100% rename from src/test/run-make/llvm-module-pass/main.rs rename to src/test/run-make/llvm-pass/main.rs diff --git a/src/test/run-make/llvm-module-pass/plugin.rs b/src/test/run-make/llvm-pass/plugin.rs similarity index 77% rename from src/test/run-make/llvm-module-pass/plugin.rs rename to src/test/run-make/llvm-pass/plugin.rs index 039de3c7179..f77b2fca857 100644 --- a/src/test/run-make/llvm-module-pass/plugin.rs +++ b/src/test/run-make/llvm-pass/plugin.rs @@ -15,12 +15,14 @@ extern crate rustc; extern crate rustc_plugin; -#[link(name = "llvm-pass", kind = "static")] +#[link(name = "llvm-function-pass", kind = "static")] +#[link(name = "llvm-module-pass", kind = "static")] extern {} use rustc_plugin::registry::Registry; #[plugin_registrar] pub fn plugin_registrar(reg: &mut Registry) { - reg.register_llvm_pass("some-llvm-pass"); + reg.register_llvm_pass("some-llvm-function-pass"); + reg.register_llvm_pass("some-llvm-module-pass"); }