練習: 関数一覧

llvm-asを参考に。無駄なincludeは多いはず&エラー処理は無視。

funclist.cpp

#include "llvm/Analysis/Verifier.h"
#include "llvm/Assembly/Parser.h"
#include "llvm/Assembly/PrintModulePass.h"
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/Module.h"
#include "llvm/PassManager.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/Streams.h"
#include "llvm/Support/SystemUtils.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/System/Signals.h"
#include 
#include 
#include 
using namespace llvm;

static cl::opt
InputFilename(cl::Positional, cl::desc("<input .llvm file>"), cl::init("-"));

int main(int argc, char **argv) {
  llvm_shutdown_obj X;  // Call llvm_shutdown() on exit.
  cl::ParseCommandLineOptions(argc, argv, "");

  int exitCode = 0;
  std::ostream *Out = 0;

  ParseError Err;
  std::auto_ptr M(ParseAssemblyFile(InputFilename, Err));
  if (M.get() == 0) {
      Err.PrintError(argv[0], errs());
      return 1;
  }

  for(Module::iterator i = M.get()->begin(); i != M.get()->end(); i++) {
      llvm::Function *f = i;
      std::cout << f->getNameStr() << std::endl;
  }
  return 0;
}

ビルド

c++ -g funclist.cpp `llvm-config --cxxflags --ldflags --libs core --libs asmparser --libs bitwriter` -o funclist

サンプルソース(sample.cpp)

int foo(int i) {
    return 0;
}

int bar(int i, char c) {
    return 0;
}

実行、出力

$ llvm-gcc --emit-llvm -S sample.cpp -o sample.ll
$./funclist sample.ll | c++filt
foo(int)
bar(int, char)