static void parseInputFilenamesFile(MemoryBuffer *Buffer, WeightedFileVector &WFV) { if (!Buffer) return; SmallVector<StringRef, 8> Entries; StringRef Data = Buffer->getBuffer(); Data.split(Entries, '\n', /*MaxSplit=*/-1, /*KeepEmpty=*/false); for (const StringRef &FileWeightEntry : Entries) { StringRef SanitizedEntry = FileWeightEntry.trim(" \t\v\f\r"); // Skip comments. if (SanitizedEntry.startswith("#")) continue; // If there's no comma, it's an unweighted profile. else if (SanitizedEntry.find(',') == StringRef::npos) WFV.emplace_back(SanitizedEntry, 1); else WFV.emplace_back(parseWeightedFile(SanitizedEntry)); } }
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> InputFilenamesFile( "input-files", cl::init(""), cl::desc("Path to file containing newline-separated " "[<weight>,]<filename> entries")); cl::alias InputFilenamesFileA("f", cl::desc("Alias for --input-files"), cl::aliasopt(InputFilenamesFile)); cl::opt<bool> DumpInputFileList( "dump-input-file-list", cl::init(false), cl::Hidden, cl::desc("Dump the list of input files and their weights, then exit")); 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"); WeightedFileVector WeightedInputs; for (StringRef Filename : InputFilenames) WeightedInputs.emplace_back(Filename, 1); for (StringRef WeightedFilename : WeightedInputFilenames) WeightedInputs.emplace_back(parseWeightedFile(WeightedFilename)); // Make sure that the file buffer stays alive for the duration of the // weighted input vector's lifetime. auto Buffer = getInputFilenamesFileBuf(InputFilenamesFile); parseInputFilenamesFile(Buffer.get(), WeightedInputs); if (WeightedInputs.empty()) exitWithError("No input files specified. See " + sys::path::filename(argv[0]) + " -help"); if (DumpInputFileList) { for (auto &WF : WeightedInputs) outs() << WF.Weight << "," << WF.Filename << "\n"; return 0; } if (ProfileKind == instr) mergeInstrProfile(WeightedInputs, OutputFilename, OutputFormat, OutputSparse); else mergeSampleProfile(WeightedInputs, OutputFilename, OutputFormat); return 0; }