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.
This commit is contained in:
Corey Farwell 2016-02-14 22:57:43 -05:00
parent 2808df961b
commit a60ec05fdc
6 changed files with 78 additions and 17 deletions

View File

@ -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

View File

@ -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

View File

@ -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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#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<TestLLVMPass> RegisterAFLPass(
"some-llvm-function-pass", "Some LLVM pass");

View File

@ -52,4 +52,4 @@ bool TestLLVMPass::runOnModule(Module &M) {
char TestLLVMPass::ID = 0; char TestLLVMPass::ID = 0;
static RegisterPass<TestLLVMPass> RegisterAFLPass( static RegisterPass<TestLLVMPass> RegisterAFLPass(
"some-llvm-pass", "Some LLVM pass"); "some-llvm-module-pass", "Some LLVM pass");

View File

@ -15,12 +15,14 @@
extern crate rustc; extern crate rustc;
extern crate rustc_plugin; 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 {} extern {}
use rustc_plugin::registry::Registry; use rustc_plugin::registry::Registry;
#[plugin_registrar] #[plugin_registrar]
pub fn plugin_registrar(reg: &mut Registry) { 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");
} }