2011-05-31 10:15:04 UTC
previous
next
#include <iostream>
#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/Type.h"
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/MemoryBuffer.h"
using namespace llvm;
#include "json.h"
using namespace json;
cl::opt<std::string> input_filename(cl::Positional, cl::desc("<input file>"), cl::init("-"));
cl::opt<std::string> output_filename("o", cl::desc("Specify output filename"), cl::value_desc("filename"));
class JsonGen {
public:
JsonObject get_json_for_module(Module* m) {
JsonObject root(JsonObject::AssocArray);
root["jsvm-json-version"] = 1;
root["module-id"] = module->getModuleIdentifier();
root["data-layout"] = module->getDataLayout();
root["target-triple"] = module->getTargetTriple();
root["functions"] = JsonObject(JsonObject::Array);
std::map<Function*, int> func_ptr_to_js_index;
int current_func_js_index = 0;
Module::iterator func_iter;
for (func_iter = module->begin(); func_iter != module->end(); func_iter++) {
func_ptr_to_js_index[&*func_iter] = current_func_js_index;
root["functions"][current_func_js_index] = JsonObject(JsonObject::AssocArray);
root["functions"][current_func_js_index]["basic-blocks"] = JsonObject(JsonObject::Array);
Function::iterator basic_block_iter;
std::map<BasicBlock*, int> basic_block_ptr_to_js_index;
int current_basic_block_js_index = 0;
for (basic_block_iter = func_iter->begin(); basic_block_iter != func_iter->end(); basic_block_iter++) {
basic_block_ptr_to_js_index[&*basic_block_iter] = current_basic_block_js_index;
root["functions"][current_func_js_index]["basic-blocks"][current_basic_block_js_index]
}
}
return root;
}
JsonObject get_json_for_function(Function* f) {
}
JsonObject get_json_for_basic_block(BasicBlock* b) {
}
JsonObject get_json_for_instruction
}
int main(int argc, char **argv) {
cl::ParseCommandLineOptions(argc, argv);
LLVMContext &context = getGlobalContext();
if (output_filename.empty()) {
if (input_filename == "-") {
output_filename = "-";
} else {
const std::string &IFN = input_filename;
int len = IFN.length();
// If the source ends in .bc, strip it off.
if (IFN[len-3] == '.' && IFN[len-2] == 'b' && IFN[len-1] == 'c')
output_filename = std::string(IFN.begin(), IFN.end()-3)+".jsvm.json";
else
output_filename = IFN+".jsvm.json";
}
}
std::cout << "input file: " << input_filename << std::endl;
std::cout << "output file: " << output_filename << std::endl;
std::string error_message;
std::auto_ptr<Module> module;
{
OwningPtr<MemoryBuffer> buffer_ptr;
buffer_ptr.reset(MemoryBuffer::getFileOrSTDIN(input_filename, &error_message));
if (buffer_ptr.get() == 0) {
std::cout << "error opening " << input_filename << ": " << error_message << std::endl;
return 0;
}
module.reset(ParseBitcodeFile(buffer_ptr.get(), getGlobalContext(), &error_message));
if (module.get() == 0) {
std::cout << "error parsing " << input_filename << ": " << error_message << std::endl;
return 0;
}
}
std::cout << root.to_string() << std::endl;
return 0;
}