[llvm-commits] [poolalloc] r136676 - in /poolalloc/trunk/tools/TypeChecker: ./ CMakeLists.txt Makefile tc.cpp
Arushi Aggarwal
aggarwa4 at illinois.edu
Mon Aug 1 21:18:20 PDT 2011
Author: aggarwa4
Date: Mon Aug 1 23:18:20 2011
New Revision: 136676
URL: http://llvm.org/viewvc/llvm-project?rev=136676&view=rev
Log:
Add a tool to instrument the type safety checks.
Added:
poolalloc/trunk/tools/TypeChecker/
poolalloc/trunk/tools/TypeChecker/CMakeLists.txt
poolalloc/trunk/tools/TypeChecker/Makefile
poolalloc/trunk/tools/TypeChecker/tc.cpp
Added: poolalloc/trunk/tools/TypeChecker/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/tools/TypeChecker/CMakeLists.txt?rev=136676&view=auto
==============================================================================
--- poolalloc/trunk/tools/TypeChecker/CMakeLists.txt (added)
+++ poolalloc/trunk/tools/TypeChecker/CMakeLists.txt Mon Aug 1 23:18:20 2011
@@ -0,0 +1,5 @@
+set(LLVM_LINK_COMPONENTS bitreader bitwriter instrumentation scalaropts ipo nativecodegen)
+file(GLOB sources *.cpp)
+add_definitions(-fno-exceptions)
+add_llvm_tool( tc ${sources} )
+target_link_libraries(tc LLVMDataStructure AssistDS )
Added: poolalloc/trunk/tools/TypeChecker/Makefile
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/tools/TypeChecker/Makefile?rev=136676&view=auto
==============================================================================
--- poolalloc/trunk/tools/TypeChecker/Makefile (added)
+++ poolalloc/trunk/tools/TypeChecker/Makefile Mon Aug 1 23:18:20 2011
@@ -0,0 +1,24 @@
+#===- tools/pa/Makefile ------------------------------------*- Makefile -*-===##
+#
+# Automatic Pool Allocation Project
+#
+# This file was developed by the LLVM research group and is distributed under
+# the University of Illinois Open Source License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+LEVEL = ../..
+TOOLNAME=tc
+
+# Initialize the USEDLIBS so we can add to it
+
+LINK_COMPONENTS := bitreader bitwriter instrumentation scalaropts ipo \
+ nativecodegen
+USEDLIBS := poolalloc.a LLVMDataStructure.a AssistDS.a
+
+# Include this here so we can get the configuration of the targets
+# that have been configured for construction. We have to do this
+# early so we can set up USEDLIBS properly before includeing Makefile.rules
+include $(LEVEL)/Makefile.common
+
+
Added: poolalloc/trunk/tools/TypeChecker/tc.cpp
URL: http://llvm.org/viewvc/llvm-project/poolalloc/trunk/tools/TypeChecker/tc.cpp?rev=136676&view=auto
==============================================================================
--- poolalloc/trunk/tools/TypeChecker/tc.cpp (added)
+++ poolalloc/trunk/tools/TypeChecker/tc.cpp Mon Aug 1 23:18:20 2011
@@ -0,0 +1,167 @@
+//===---- tc - Automatic Type Checking Compiler Tool --------------------===//
+//
+// Automatic Pool Allocation Project
+//
+// This file was developed by the LLVM research group and is distributed
+// under the University of Illinois Open Source License. See LICENSE.TXT for
+// details.
+//
+//===--------------------------------------------------------------------===//
+//
+// This program is a tool to run the Automatic Type Checker passes on a
+// bytecode input file.
+//
+//===--------------------------------------------------------------------===//
+
+#include "llvm/Config/config.h"
+#include "llvm/Module.h"
+#include "llvm/LLVMContext.h"
+#include "llvm/Bitcode/ReaderWriter.h"
+#include "llvm/PassManager.h"
+#include "llvm/Pass.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/PluginLoader.h"
+#include "llvm/Support/FileUtilities.h"
+#include "llvm/Target/TargetData.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Analysis/Verifier.h"
+#include "llvm/System/Signals.h"
+#include "llvm/Support/raw_os_ostream.h"
+
+#include "assistDS/TypeChecks.h"
+#include "assistDS/TypeChecksOpt.h"
+
+#include <fstream>
+#include <iostream>
+#include <memory>
+
+using namespace llvm;
+
+// General options for sc.
+static cl::opt<std::string>
+InputFilename(cl::Positional, cl::desc("<input bytecode>"), cl::init("-"));
+
+static cl::opt<std::string>
+OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"));
+
+static cl::opt<bool> Force("f", cl::desc("Overwrite output files"));
+
+static cl::opt<bool>
+EnableTypeSafetyOpts("enable-typesafety-opt",
+ cl::init(false),
+ cl::desc("Disable type-safety optimizations"));
+
+// GetFileNameRoot - Helper function to get the basename of a filename.
+static inline std::string
+GetFileNameRoot(const std::string &InputFilename) {
+ std::string IFN = InputFilename;
+ std::string outputFilename;
+ int Len = IFN.length();
+ if ((Len > 2) &&
+ IFN[Len-3] == '.' && IFN[Len-2] == 'b' && IFN[Len-1] == 'c') {
+ outputFilename = std::string(IFN.begin(), IFN.end()-3); // s/.bc/.s/
+ } else {
+ outputFilename = IFN;
+ }
+ return outputFilename;
+}
+
+
+// main - Entry point for the sc compiler.
+//
+int main(int argc, char **argv) {
+
+ cl::ParseCommandLineOptions(argc, argv, " llvm system compiler\n");
+ sys::PrintStackTraceOnErrorSignal();
+
+ // Load the module to be compiled...
+ std::auto_ptr<Module> M;
+ std::string ErrorMessage;
+ if (MemoryBuffer *Buffer
+ = MemoryBuffer::getFileOrSTDIN(InputFilename, &ErrorMessage)) {
+ M.reset(ParseBitcodeFile(Buffer, getGlobalContext(), &ErrorMessage));
+ delete Buffer;
+ }
+
+ if (M.get() == 0) {
+ std::cerr << argv[0] << ": bytecode didn't read correctly.\n";
+ return 1;
+ }
+
+ // Build up all of the passes that we want to do to the module...
+ PassManager Passes;
+
+ Passes.add(new TargetData(M.get()));
+
+ // Currently deactiviated
+ Passes.add(new TypeChecks());
+ if(EnableTypeSafetyOpts)
+ Passes.add(new TypeChecksOpt());
+
+ // Verify the final result
+ Passes.add(createVerifierPass());
+
+ // Figure out where we are going to send the output...
+ raw_fd_ostream *Out = 0;
+ std::string error;
+ if (OutputFilename != "") {
+ if (OutputFilename != "-") {
+ // Specified an output filename?
+ if (!Force && std::ifstream(OutputFilename.c_str())) {
+ // If force is not specified, make sure not to overwrite a file!
+ std::cerr << argv[0] << ": error opening '" << OutputFilename
+ << "': file exists!\n"
+ << "Use -f command line argument to force output\n";
+ return 1;
+ }
+ Out = new raw_fd_ostream (OutputFilename.c_str(), error);
+
+ // Make sure that the Out file gets unlinked from the disk if we get a
+ // SIGINT
+ sys::RemoveFileOnSignal(sys::Path(OutputFilename));
+ } else {
+ Out = new raw_stdout_ostream();
+ }
+ } else {
+ if (InputFilename == "-") {
+ OutputFilename = "-";
+ Out = new raw_stdout_ostream();
+ } else {
+ OutputFilename = GetFileNameRoot(InputFilename);
+
+ OutputFilename += ".abc.bc";
+ }
+
+ if (!Force && std::ifstream(OutputFilename.c_str())) {
+ // If force is not specified, make sure not to overwrite a file!
+ std::cerr << argv[0] << ": error opening '" << OutputFilename
+ << "': file exists!\n"
+ << "Use -f command line argument to force output\n";
+ return 1;
+ }
+
+ Out = new raw_fd_ostream(OutputFilename.c_str(), error);
+ if (error.length()) {
+ std::cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
+ delete Out;
+ return 1;
+ }
+
+ // Make sure that the Out file gets unlinked from the disk if we get a
+ // SIGINT
+ sys::RemoveFileOnSignal(sys::Path(OutputFilename));
+ }
+
+ // Add the writing of the output file to the list of passes
+ Passes.add (createBitcodeWriterPass(*Out));
+
+ // Run our queue of passes all at once now, efficiently.
+ Passes.run(*M.get());
+
+ // Delete the ostream
+ delete Out;
+
+ return 0;
+}
+
More information about the llvm-commits
mailing list