static void addWeightedInput(WeightedFileVector &WNI, const WeightedFile &WF) { StringRef Filename = WF.Filename; uint64_t Weight = WF.Weight; // If it's STDIN just pass it on. if (Filename == "-") { WNI.push_back({Filename, Weight}); return; } llvm::sys::fs::file_status Status; llvm::sys::fs::status(Filename, Status); if (!llvm::sys::fs::exists(Status)) exitWithErrorCode(make_error_code(errc::no_such_file_or_directory), Filename); // If it's a source file, collect it. if (llvm::sys::fs::is_regular_file(Status)) { WNI.push_back({Filename, Weight}); return; } if (llvm::sys::fs::is_directory(Status)) { std::error_code EC; for (llvm::sys::fs::recursive_directory_iterator F(Filename, EC), E; F != E && !EC; F.increment(EC)) { if (llvm::sys::fs::is_regular_file(F->path())) { addWeightedInput(WNI, {F->path(), Weight}); } } if (EC) exitWithErrorCode(EC, Filename); } }
static int merge_main(int argc, const char *argv[]) { cl::list<std::string> InputFilenames(cl::Positional, cl::desc("<filename...>")); cl::list<std::string> WeightedInputFilenames("weighted-input", cl::desc("<weight>,<filename>")); cl::opt<std::string> OutputFilename("output", cl::value_desc("output"), cl::init("-"), cl::Required, cl::desc("Output file")); cl::alias OutputFilenameA("o", cl::desc("Alias for --output"), cl::aliasopt(OutputFilename)); cl::opt<ProfileKinds> ProfileKind( cl::desc("Profile kind:"), cl::init(instr), cl::values(clEnumVal(instr, "Instrumentation profile (default)"), clEnumVal(sample, "Sample profile"), clEnumValEnd)); cl::opt<ProfileFormat> OutputFormat( cl::desc("Format of output profile"), cl::init(PF_Binary), cl::values(clEnumValN(PF_Binary, "binary", "Binary encoding (default)"), clEnumValN(PF_Text, "text", "Text encoding"), clEnumValN(PF_GCC, "gcc", "GCC encoding (only meaningful for -sample)"), clEnumValEnd)); cl::opt<bool> OutputSparse("sparse", cl::init(false), cl::desc("Generate a sparse profile (only meaningful for -instr)")); cl::ParseCommandLineOptions(argc, argv, "LLVM profile data merger\n"); if (InputFilenames.empty() && WeightedInputFilenames.empty()) exitWithError("No input files specified. See " + sys::path::filename(argv[0]) + " -help"); WeightedFileVector WeightedInputs; for (StringRef Filename : InputFilenames) WeightedInputs.push_back(WeightedFile(Filename, 1)); for (StringRef WeightedFilename : WeightedInputFilenames) WeightedInputs.push_back(parseWeightedFile(WeightedFilename)); if (ProfileKind == instr) mergeInstrProfile(WeightedInputs, OutputFilename, OutputFormat, OutputSparse); else mergeSampleProfile(WeightedInputs, OutputFilename, OutputFormat); return 0; }