/// the host machine, nor will segment prefix be added.
std::string getInstrProfNameSectionName(const Module *M = nullptr);
+/// Similar to the above, but used by host tool (e.g, coverage) which has
+/// object format information. The section name returned is not prefixed
+/// with segment name.
+std::string getInstrProfNameSectionNameInObject(bool isCoff);
+
/// Return the name of the data section containing per-function control
/// data. If M is null, the target platform is assumed to be the same as
/// the host machine, and the segment prefix will not be added.
std::string getInstrProfDataSectionName(const Module *M = nullptr);
+/// Similar to the above, but used by host tool (e.g, coverage) which has
+/// object format information. The section name returned is not prefixed
+/// with segment name.
+std::string getInstrProfDataSectionNameInObject(bool isCoff);
+
/// Return the name of data section containing pointers to value profile
/// counters/nodes. If M is null, the target platform is assumed to be
/// the same as the host machine, and the segment prefix will not be added.
/// Return the name of the section containing function coverage mapping
/// data.
std::string getInstrProfCoverageSectionName(const Module *M = nullptr);
+/// Similar to the above, but used by host tool (e.g, coverage) which has
+/// object format information. The section name returned is not prefixed
+/// with segment name.
+std::string getInstrProfCoverageSectionNameInObject(bool isCoff);
/// Return the name prefix of variables containing instrumented function names.
inline StringRef getInstrProfNameVarPrefix() { return "__profn_"; }
// section(".eh_frame") gcc will produce:
//
// .section .eh_frame,"a",@progbits
-
- // TODO: to support Win->ELF cross compilation with coverage properly,
- // need to pass the module pointer to the following call.
- if (Name == getInstrProfCoverageSectionName())
+
+ if (Name == getInstrProfCoverageSectionNameInObject(false /*not coff*/))
return SectionKind::getMetadata();
if (Name.empty() || Name[0] != '.') return K;
//
//===----------------------------------------------------------------------===//
+#include "llvm/ProfileData/Coverage/CoverageMappingReader.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
-#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
-#include "llvm/ADT/Triple.h"
+#include "llvm/ADT/Triple.h"
#include "llvm/Object/Binary.h"
+#include "llvm/Object/COFF.h"
#include "llvm/Object/Error.h"
#include "llvm/Object/MachOUniversal.h"
#include "llvm/Object/ObjectFile.h"
-#include "llvm/ProfileData/Coverage/CoverageMappingReader.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Debug.h"
+#include "llvm/Support/Endian.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
-#include "llvm/Support/Endian.h"
#include "llvm/Support/LEB128.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
: support::endianness::big;
// Look for the sections that we are interested in.
- // TODO: with the current getInstrProfXXXSectionName interfaces, the
- // the coverage reader host tool is limited to read coverage section on
- // binaries with compatible profile section naming scheme as the host
- // platform. Currently, COFF format binaries have different section
- // naming scheme from the all the rest.
- auto NamesSection = lookupSection(*OF, getInstrProfNameSectionName());
+ bool IsCoff = (dyn_cast<COFFObjectFile>(OF.get()) != nullptr);
+ auto NamesSection =
+ lookupSection(*OF, getInstrProfNameSectionNameInObject(IsCoff));
if (auto E = NamesSection.takeError())
return E;
- auto CoverageSection = lookupSection(*OF, getInstrProfCoverageSectionName());
+ auto CoverageSection =
+ lookupSection(*OF, getInstrProfCoverageSectionNameInObject(IsCoff));
if (auto E = CoverageSection.takeError())
return E;
#include "llvm/ProfileData/InstrProfData.inc"
};
-std::string getInstrProfSectionName(const Module *M, InstrProfSectKind Kind) {
+std::string getInstrProfSectionName(bool isCoff, InstrProfSectKind Kind) {
+ return isCoff ? InstrProfSectNameCoff[Kind] : InstrProfSectNameCommon[Kind];
+}
+std::string getInstrProfSectionName(const Module *M, InstrProfSectKind Kind) {
if (!M)
return InstrProfSectName[Kind];
return getInstrProfSectionName(M, IPSK_name);
}
+std::string getInstrProfNameSectionNameInObject(bool isCoff) {
+ return getInstrProfSectionName(isCoff, IPSK_name);
+}
+
std::string getInstrProfDataSectionName(const Module *M) {
return getInstrProfSectionName(M, IPSK_data);
}
+std::string getInstrProfDataSectionNameInObject(bool isCoff) {
+ return getInstrProfSectionName(isCoff, IPSK_data);
+}
+
std::string getInstrProfValuesSectionName(const Module *M) {
return getInstrProfSectionName(M, IPSK_vals);
}
return getInstrProfSectionName(M, IPSK_covmap);
}
+std::string getInstrProfCoverageSectionNameInObject(bool isCoff) {
+ return getInstrProfSectionName(isCoff, IPSK_covmap);
+}
+
void SoftInstrProfErrors::addError(instrprof_error IE) {
if (IE == instrprof_error::success)
return;