Rollback r257547 -- buildbot failure TBI

llvm-svn: 257549
This commit is contained in:
Xinliang David Li 2016-01-13 00:27:24 +00:00
parent 0ae163f9ea
commit 8c65278179
2 changed files with 20 additions and 53 deletions

View File

@ -20,9 +20,8 @@
#include "llvm/ADT/Hashing.h"
#include "llvm/ADT/Triple.h"
#include "llvm/ADT/iterator.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/ProfileData/InstrProfData.inc"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/ErrorOr.h"
#include "llvm/Support/raw_ostream.h"
#include <system_error>
@ -480,50 +479,14 @@ inline std::error_code make_error_code(coveragemap_error E) {
// [Encoded Region Mapping Data]
LLVM_PACKED_START
template <class IntPtrT> struct CovMapFunctionRecord {
#define COVMAP_FUNC_RECORD(Type, LLVMType, Name, Init) Type Name;
#include "llvm/ProfileData/InstrProfData.inc"
// Return the structural hash associated with the function.
template <support::endianness Endian> uint64_t getFuncHash() const {
return support::endian::byte_swap<uint64_t, Endian>(FuncHash);
}
// Return the coverage map data size for the funciton.
template <support::endianness Endian> uint32_t getDataSize() const {
return support::endian::byte_swap<uint32_t, Endian>(DataSize);
}
// Return function lookup key. The value is consider opaque.
template <support::endianness Endian> IntPtrT getFuncNameRef() const {
return support::endian::byte_swap<IntPtrT, Endian>(NamePtr);
}
// Return the PGO name of the function */
template <support::endianness Endian>
std::error_code getFuncName(InstrProfSymtab &ProfileNames,
StringRef &FuncName) const {
IntPtrT NameRef = getFuncNameRef<Endian>();
uint32_t NameS = support::endian::byte_swap<IntPtrT, Endian>(NameSize);
FuncName = ProfileNames.getFuncName(NameRef, NameS);
if (NameS && FuncName.empty())
return coveragemap_error::malformed;
return std::error_code();
}
#define COVMAP_FUNC_RECORD(Type, LLVMType, Name, Init) Type Name;
#include "llvm/ProfileData/InstrProfData.inc"
};
// Per module coverage mapping data header, i.e. CoverageMapFileHeader
// documented above.
struct CovMapHeader {
#define COVMAP_HEADER(Type, LLVMType, Name, Init) Type Name;
#include "llvm/ProfileData/InstrProfData.inc"
template <support::endianness Endian> uint32_t getNRecords() const {
return support::endian::byte_swap<uint32_t, Endian>(NRecords);
}
template <support::endianness Endian> uint32_t getFilenamesSize() const {
return support::endian::byte_swap<uint32_t, Endian>(FilenamesSize);
}
template <support::endianness Endian> uint32_t getCoverageSize() const {
return support::endian::byte_swap<uint32_t, Endian>(CoverageSize);
}
template <support::endianness Endian> uint32_t getVersion() const {
return support::endian::byte_swap<uint32_t, Endian>(Version);
}
};
LLVM_PACKED_END

View File

@ -319,10 +319,13 @@ static std::error_code readCoverageMappingData(
if (Buf + sizeof(CovMapHeader) > End)
return coveragemap_error::malformed;
auto CovHeader = reinterpret_cast<const coverage::CovMapHeader *>(Buf);
uint32_t NRecords = CovHeader->getNRecords<Endian>();
uint32_t FilenamesSize = CovHeader->getFilenamesSize<Endian>();
uint32_t CoverageSize = CovHeader->getCoverageSize<Endian>();
uint32_t Version = CovHeader->getVersion<Endian>();
uint32_t NRecords =
endian::byte_swap<uint32_t, Endian>(CovHeader->NRecords);
uint32_t FilenamesSize =
endian::byte_swap<uint32_t, Endian>(CovHeader->FilenamesSize);
uint32_t CoverageSize =
endian::byte_swap<uint32_t, Endian>(CovHeader->CoverageSize);
uint32_t Version = endian::byte_swap<uint32_t, Endian>(CovHeader->Version);
Buf = reinterpret_cast<const char *>(++CovHeader);
if (Version > coverage::CoverageMappingCurrentVersion)
@ -357,8 +360,11 @@ static std::error_code readCoverageMappingData(
reinterpret_cast<const coverage::CovMapFunctionRecord<T> *>(FunBuf);
while ((const char *)CFR < FunEnd) {
// Read the function information
uint32_t DataSize = CFR->template getDataSize<Endian>();
uint64_t FuncHash = CFR->template getFuncHash<Endian>();
T NamePtr = endian::byte_swap<T, Endian>(CFR->NamePtr);
uint32_t NameSize = endian::byte_swap<uint32_t, Endian>(CFR->NameSize);
uint32_t DataSize = endian::byte_swap<uint32_t, Endian>(CFR->DataSize);
uint64_t FuncHash = endian::byte_swap<uint64_t, Endian>(CFR->FuncHash);
CFR++;
// Now use that to read the coverage data.
if (CovBuf + DataSize > CovEnd)
@ -369,18 +375,16 @@ static std::error_code readCoverageMappingData(
// Ignore this record if we already have a record that points to the same
// function name. This is useful to ignore the redundant records for the
// functions with ODR linkage.
T NameRef = CFR->template getFuncNameRef<Endian>();
if (!UniqueFunctionMappingData.insert(NameRef).second)
if (!UniqueFunctionMappingData.insert(NamePtr).second)
continue;
StringRef FuncName;
if (std::error_code EC =
CFR->template getFuncName<Endian>(ProfileNames, FuncName))
return EC;
// Finally, grab the name and create a record.
StringRef FuncName = ProfileNames.getFuncName(NamePtr, NameSize);
if (NameSize && FuncName.empty())
return coveragemap_error::malformed;
Records.push_back(BinaryCoverageReader::ProfileMappingRecord(
CoverageMappingVersion(Version), FuncName, FuncHash, Mapping,
FilenamesBegin, Filenames.size() - FilenamesBegin));
CFR++;
}
}