int main(int argc, char *argv[]) {
	if (argc < 3) {
		usage(argv[0]);
		exit(1);
	}

	// TODO: Check for failure
	ifstream config_file;
	config_file.open(argv[1]);

	ifstream llvmir_file;
	llvmir_file.open(argv[2]);

	outputName = argv[3];

	// Parse json file
	Rewriter rw;
	try {
		rw.parseConfig(config_file);
	}
	catch (runtime_error ex){
		string exceptionString = "Error parsing configuration: ";
		logger.write_error(exceptionString.append(ex.what()));
		config_file.close();
		llvmir_file.close();
		return 1;
	}

	// Get module from LLVM file
	LLVMContext &Context = getGlobalContext();
	SMDiagnostic Err;
#if (LLVM_VERSION_MINOR >= 6)
	std::unique_ptr<Module> _m = parseIRFile(argv[2], Err, Context);
	Module *m = _m.release();
#else
	Module *m = ParseIRFile(argv[2], Err, Context);
#endif
	if (!m) {
		logger.write_error("Error parsing .bc file.");
		Err.print(argv[0], errs());
		config_file.close();
		llvmir_file.close();
		return 1;
	}

	loadPlugins(rw,m);

	// Instrument
	bool resultOK = instrumentModule(*m, rw);

	delete m;
	config_file.close();
	llvmir_file.close();

	if(resultOK) {
		logger.write_info("DONE.");
		return 0;
	}
	else {
		logger.write_error("FAILED.");
		return 1;
	}
}