源码中如何对选项进行解析

参考clang/tools/driver

clang中使用下面的方法来对clang的命令行进行解析。

C++
  Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm);  # 获得所有-mllvm后的内容
  Opts.OutputPath = std::string(Args.getLastArgValue(OPT_o));  # 获得 -o 后的文件名

OPT_mllvmOPT_o等的定义见编译出来的Options.inc,由同名的Options.td编译出来,如clang/include/clang/Driver/Options.td

C++
enum ID {
    OPT_INVALID = 0, // This is not an option ID.
#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__),
#include "clang/Driver/Options.inc"
    LastOption
#undef OPTION
  };
}

以下代码使-mllvm后的内容生效

C++
  // Honor -mllvm.
  //
  // FIXME: Remove this, one day.
  if (!Asm.LLVMArgs.empty()) {
    unsigned NumArgs = Asm.LLVMArgs.size();
    auto Args = std::make_unique<const char*[]>(NumArgs + 2);
    Args[0] = "clang (LLVM option parsing)";
    for (unsigned i = 0; i != NumArgs; ++i)
      Args[i + 1] = Asm.LLVMArgs[i].c_str();
    Args[NumArgs + 1] = nullptr;
    llvm::cl::ParseCommandLineOptions(NumArgs + 1, Args.get());
  }

ParseFrontendArgs()函数会parse前端所有的选项, 该函数被bool CompilerInvocation::CreateFromArgsImpl()所调用。