]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | //===- TestingSupport.cpp - Convert objects files into test files --------===// |
2 | // | |
3 | // The LLVM Compiler Infrastructure | |
4 | // | |
5 | // This file is distributed under the University of Illinois Open Source | |
6 | // License. See LICENSE.TXT for details. | |
7 | // | |
8 | //===----------------------------------------------------------------------===// | |
9 | ||
10 | #include "llvm/Object/ObjectFile.h" | |
1a4d82fc | 11 | #include "llvm/Support/CommandLine.h" |
85aaf69f | 12 | #include "llvm/Support/LEB128.h" |
1a4d82fc | 13 | #include "llvm/Support/ManagedStatic.h" |
1a4d82fc | 14 | #include "llvm/Support/PrettyStackTrace.h" |
85aaf69f SL |
15 | #include "llvm/Support/Signals.h" |
16 | #include "llvm/Support/raw_ostream.h" | |
1a4d82fc | 17 | #include <functional> |
85aaf69f | 18 | #include <system_error> |
1a4d82fc JJ |
19 | |
20 | using namespace llvm; | |
21 | using namespace object; | |
22 | ||
85aaf69f | 23 | int convertForTestingMain(int argc, const char *argv[]) { |
1a4d82fc JJ |
24 | sys::PrintStackTraceOnErrorSignal(); |
25 | PrettyStackTraceProgram X(argc, argv); | |
26 | llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. | |
27 | ||
28 | cl::opt<std::string> InputSourceFile(cl::Positional, cl::Required, | |
29 | cl::desc("<Source file>")); | |
30 | ||
31 | cl::opt<std::string> OutputFilename( | |
32 | "o", cl::Required, | |
33 | cl::desc( | |
34 | "File with the profile data obtained after an instrumented run")); | |
35 | ||
36 | cl::ParseCommandLineOptions(argc, argv, "LLVM code coverage tool\n"); | |
37 | ||
38 | auto ObjErr = llvm::object::ObjectFile::createObjectFile(InputSourceFile); | |
39 | if (auto Err = ObjErr.getError()) { | |
40 | errs() << "error: " << Err.message() << "\n"; | |
41 | return 1; | |
42 | } | |
85aaf69f | 43 | ObjectFile *OF = ObjErr.get().getBinary(); |
1a4d82fc JJ |
44 | auto BytesInAddress = OF->getBytesInAddress(); |
45 | if (BytesInAddress != 8) { | |
46 | errs() << "error: 64 bit binary expected\n"; | |
47 | return 1; | |
48 | } | |
49 | ||
50 | // Look for the sections that we are interested in. | |
51 | int FoundSectionCount = 0; | |
52 | SectionRef ProfileNames, CoverageMapping; | |
53 | for (const auto &Section : OF->sections()) { | |
54 | StringRef Name; | |
55 | if (Section.getName(Name)) | |
56 | return 1; | |
57 | if (Name == "__llvm_prf_names") { | |
58 | ProfileNames = Section; | |
59 | } else if (Name == "__llvm_covmap") { | |
60 | CoverageMapping = Section; | |
61 | } else | |
62 | continue; | |
63 | ++FoundSectionCount; | |
64 | } | |
65 | if (FoundSectionCount != 2) | |
66 | return 1; | |
67 | ||
68 | // Get the contents of the given sections. | |
85aaf69f | 69 | uint64_t ProfileNamesAddress = ProfileNames.getAddress(); |
1a4d82fc | 70 | StringRef CoverageMappingData; |
1a4d82fc JJ |
71 | StringRef ProfileNamesData; |
72 | if (CoverageMapping.getContents(CoverageMappingData) || | |
1a4d82fc JJ |
73 | ProfileNames.getContents(ProfileNamesData)) |
74 | return 1; | |
75 | ||
76 | int FD; | |
77 | if (auto Err = | |
78 | sys::fs::openFileForWrite(OutputFilename, FD, sys::fs::F_None)) { | |
79 | errs() << "error: " << Err.message() << "\n"; | |
80 | return 1; | |
81 | } | |
82 | ||
83 | raw_fd_ostream OS(FD, true); | |
84 | OS << "llvmcovmtestdata"; | |
85 | encodeULEB128(ProfileNamesData.size(), OS); | |
86 | encodeULEB128(ProfileNamesAddress, OS); | |
87 | OS << ProfileNamesData << CoverageMappingData; | |
88 | ||
89 | return 0; | |
90 | } |