mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 21:24:00 +00:00
Remove object_error::success and use std::error_code() instead
make_error_code(object_error) is slow because object::object_category() uses a ManagedStatic variable. But the real problem is that the function is called too frequently. This patch uses std::error_code() instead of object_error::success. In most cases, we return "success", so this patch reduces number of function calls to that function. http://reviews.llvm.org/D10333 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239409 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -46,7 +46,7 @@ static std::error_code checkOffset(MemoryBufferRef M, uintptr_t Addr,
|
||||
Addr < uintptr_t(M.getBufferStart())) {
|
||||
return object_error::unexpected_eof;
|
||||
}
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
// Sets Obj unless any bytes in [addr, addr + size) fall outsize of m.
|
||||
@ -59,7 +59,7 @@ static std::error_code getObject(const T *&Obj, MemoryBufferRef M,
|
||||
if (std::error_code EC = checkOffset(M, Addr, Size))
|
||||
return EC;
|
||||
Obj = reinterpret_cast<const T *>(Addr);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
// Decode a string table entry in base 64 (//AAAAAA). Expects \arg Str without
|
||||
@ -156,11 +156,11 @@ std::error_code COFFObjectFile::getSymbolAddress(DataRefImpl Ref,
|
||||
|
||||
if (Symb.isAnyUndefined()) {
|
||||
Result = UnknownAddressOrSize;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
if (Symb.isCommon()) {
|
||||
Result = UnknownAddressOrSize;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
int32_t SectionNumber = Symb.getSectionNumber();
|
||||
if (!COFF::isReservedSectionNumber(SectionNumber)) {
|
||||
@ -169,11 +169,11 @@ std::error_code COFFObjectFile::getSymbolAddress(DataRefImpl Ref,
|
||||
return EC;
|
||||
|
||||
Result = Section->VirtualAddress + Symb.getValue();
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
Result = Symb.getValue();
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code COFFObjectFile::getSymbolType(DataRefImpl Ref,
|
||||
@ -205,7 +205,7 @@ std::error_code COFFObjectFile::getSymbolType(DataRefImpl Ref,
|
||||
COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA))
|
||||
Result = SymbolRef::ST_Data;
|
||||
}
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
uint32_t COFFObjectFile::getSymbolFlags(DataRefImpl Ref) const {
|
||||
@ -258,7 +258,7 @@ COFFObjectFile::getSymbolSection(DataRefImpl Ref,
|
||||
Ref.p = reinterpret_cast<uintptr_t>(Sec);
|
||||
Result = section_iterator(SectionRef(Ref, this));
|
||||
}
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
void COFFObjectFile::moveSectionNext(DataRefImpl &Ref) const {
|
||||
@ -417,7 +417,7 @@ std::error_code COFFObjectFile::initSymbolTablePtr() {
|
||||
// Check that the string table is null terminated if has any in it.
|
||||
if (StringTableSize > 4 && StringTable[StringTableSize - 1] != 0)
|
||||
return object_error::parse_failed;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
// Returns the file offset for the given VA.
|
||||
@ -438,7 +438,7 @@ std::error_code COFFObjectFile::getRvaPtr(uint32_t Addr, uintptr_t &Res) const {
|
||||
if (SectionStart <= Addr && Addr < SectionEnd) {
|
||||
uint32_t Offset = Addr - SectionStart;
|
||||
Res = uintptr_t(base()) + Section->PointerToRawData + Offset;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
}
|
||||
return object_error::parse_failed;
|
||||
@ -454,7 +454,7 @@ std::error_code COFFObjectFile::getHintName(uint32_t Rva, uint16_t &Hint,
|
||||
const uint8_t *Ptr = reinterpret_cast<const uint8_t *>(IntPtr);
|
||||
Hint = *reinterpret_cast<const ulittle16_t *>(Ptr);
|
||||
Name = StringRef(reinterpret_cast<const char *>(Ptr + 2));
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
// Find the import table.
|
||||
@ -463,11 +463,11 @@ std::error_code COFFObjectFile::initImportTablePtr() {
|
||||
// the import table, do nothing.
|
||||
const data_directory *DataEntry;
|
||||
if (getDataDirectory(COFF::IMPORT_TABLE, DataEntry))
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
|
||||
// Do nothing if the pointer to import table is NULL.
|
||||
if (DataEntry->RelativeVirtualAddress == 0)
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
|
||||
uint32_t ImportTableRva = DataEntry->RelativeVirtualAddress;
|
||||
// -1 because the last entry is the null entry.
|
||||
@ -481,16 +481,16 @@ std::error_code COFFObjectFile::initImportTablePtr() {
|
||||
return EC;
|
||||
ImportDirectory = reinterpret_cast<
|
||||
const import_directory_table_entry *>(IntPtr);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
// Initializes DelayImportDirectory and NumberOfDelayImportDirectory.
|
||||
std::error_code COFFObjectFile::initDelayImportTablePtr() {
|
||||
const data_directory *DataEntry;
|
||||
if (getDataDirectory(COFF::DELAY_IMPORT_DESCRIPTOR, DataEntry))
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
if (DataEntry->RelativeVirtualAddress == 0)
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
|
||||
uint32_t RVA = DataEntry->RelativeVirtualAddress;
|
||||
NumberOfDelayImportDirectory = DataEntry->Size /
|
||||
@ -501,7 +501,7 @@ std::error_code COFFObjectFile::initDelayImportTablePtr() {
|
||||
return EC;
|
||||
DelayImportDirectory = reinterpret_cast<
|
||||
const delay_import_directory_table_entry *>(IntPtr);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
// Find the export table.
|
||||
@ -510,11 +510,11 @@ std::error_code COFFObjectFile::initExportTablePtr() {
|
||||
// the export table, do nothing.
|
||||
const data_directory *DataEntry;
|
||||
if (getDataDirectory(COFF::EXPORT_TABLE, DataEntry))
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
|
||||
// Do nothing if the pointer to export table is NULL.
|
||||
if (DataEntry->RelativeVirtualAddress == 0)
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
|
||||
uint32_t ExportTableRva = DataEntry->RelativeVirtualAddress;
|
||||
uintptr_t IntPtr = 0;
|
||||
@ -522,15 +522,15 @@ std::error_code COFFObjectFile::initExportTablePtr() {
|
||||
return EC;
|
||||
ExportDirectory =
|
||||
reinterpret_cast<const export_directory_table_entry *>(IntPtr);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code COFFObjectFile::initBaseRelocPtr() {
|
||||
const data_directory *DataEntry;
|
||||
if (getDataDirectory(COFF::BASE_RELOCATION_TABLE, DataEntry))
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
if (DataEntry->RelativeVirtualAddress == 0)
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
|
||||
uintptr_t IntPtr = 0;
|
||||
if (std::error_code EC = getRvaPtr(DataEntry->RelativeVirtualAddress, IntPtr))
|
||||
@ -539,7 +539,7 @@ std::error_code COFFObjectFile::initBaseRelocPtr() {
|
||||
IntPtr);
|
||||
BaseRelocEnd = reinterpret_cast<coff_base_reloc_block_header *>(
|
||||
IntPtr + DataEntry->Size);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC)
|
||||
@ -604,7 +604,7 @@ COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC)
|
||||
if (COFFHeader) {
|
||||
// The prior checkSize call may have failed. This isn't a hard error
|
||||
// because we were just trying to sniff out bigobj.
|
||||
EC = object_error::success;
|
||||
EC = std::error_code();
|
||||
CurPtr += sizeof(coff_file_header);
|
||||
|
||||
if (COFFHeader->isImportLibrary())
|
||||
@ -666,7 +666,7 @@ COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC)
|
||||
if ((EC = initBaseRelocPtr()))
|
||||
return;
|
||||
|
||||
EC = object_error::success;
|
||||
EC = std::error_code();
|
||||
}
|
||||
|
||||
basic_symbol_iterator COFFObjectFile::symbol_begin_impl() const {
|
||||
@ -792,13 +792,13 @@ iterator_range<base_reloc_iterator> COFFObjectFile::base_relocs() const {
|
||||
|
||||
std::error_code COFFObjectFile::getPE32Header(const pe32_header *&Res) const {
|
||||
Res = PE32Header;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code
|
||||
COFFObjectFile::getPE32PlusHeader(const pe32plus_header *&Res) const {
|
||||
Res = PE32PlusHeader;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code
|
||||
@ -817,18 +817,18 @@ COFFObjectFile::getDataDirectory(uint32_t Index,
|
||||
return object_error::parse_failed;
|
||||
}
|
||||
Res = &DataDirectory[Index];
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code COFFObjectFile::getSection(int32_t Index,
|
||||
const coff_section *&Result) const {
|
||||
Result = nullptr;
|
||||
if (COFF::isReservedSectionNumber(Index))
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
if (static_cast<uint32_t>(Index) <= getNumberOfSections()) {
|
||||
// We already verified the section table data, so no need to check again.
|
||||
Result = SectionTable + (Index - 1);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
return object_error::parse_failed;
|
||||
}
|
||||
@ -841,7 +841,7 @@ std::error_code COFFObjectFile::getString(uint32_t Offset,
|
||||
if (Offset >= StringTableSize)
|
||||
return object_error::unexpected_eof;
|
||||
Result = StringRef(StringTable + Offset);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code COFFObjectFile::getSymbolName(COFFSymbolRef Symbol,
|
||||
@ -851,7 +851,7 @@ std::error_code COFFObjectFile::getSymbolName(COFFSymbolRef Symbol,
|
||||
uint32_t Offset = Symbol.getStringTableOffset().Offset;
|
||||
if (std::error_code EC = getString(Offset, Res))
|
||||
return EC;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
if (Symbol.getShortName()[COFF::NameSize - 1] == 0)
|
||||
@ -860,7 +860,7 @@ std::error_code COFFObjectFile::getSymbolName(COFFSymbolRef Symbol,
|
||||
else
|
||||
// Not null terminated, use all 8 bytes.
|
||||
Res = StringRef(Symbol.getShortName(), COFF::NameSize);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
ArrayRef<uint8_t>
|
||||
@ -911,7 +911,7 @@ std::error_code COFFObjectFile::getSectionName(const coff_section *Sec,
|
||||
}
|
||||
|
||||
Res = Name;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
uint64_t COFFObjectFile::getSectionSize(const coff_section *Sec) const {
|
||||
@ -949,7 +949,7 @@ COFFObjectFile::getSectionContents(const coff_section *Sec,
|
||||
if (checkOffset(Data, ConStart, SectionSize))
|
||||
return object_error::parse_failed;
|
||||
Res = makeArrayRef(reinterpret_cast<const uint8_t *>(ConStart), SectionSize);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
const coff_relocation *COFFObjectFile::toRel(DataRefImpl Rel) const {
|
||||
@ -974,7 +974,7 @@ std::error_code COFFObjectFile::getRelocationOffset(DataRefImpl Rel,
|
||||
getObject(VirtualAddressPtr, Data, &R->VirtualAddress))
|
||||
return EC;
|
||||
Res = *VirtualAddressPtr;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
symbol_iterator COFFObjectFile::getRelocationSymbol(DataRefImpl Rel) const {
|
||||
@ -1008,7 +1008,7 @@ std::error_code COFFObjectFile::getRelocationType(DataRefImpl Rel,
|
||||
uint64_t &Res) const {
|
||||
const coff_relocation* R = toRel(Rel);
|
||||
Res = R->Type;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
const coff_section *
|
||||
@ -1109,7 +1109,7 @@ COFFObjectFile::getRelocationTypeName(DataRefImpl Rel,
|
||||
Res = "Unknown";
|
||||
}
|
||||
Result.append(Res.begin(), Res.end());
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
#undef LLVM_COFF_SWITCH_RELOC_TYPE_NAME
|
||||
@ -1130,7 +1130,7 @@ void ImportDirectoryEntryRef::moveNext() {
|
||||
std::error_code ImportDirectoryEntryRef::getImportTableEntry(
|
||||
const import_directory_table_entry *&Result) const {
|
||||
Result = ImportTable + Index;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
static imported_symbol_iterator
|
||||
@ -1192,19 +1192,19 @@ std::error_code ImportDirectoryEntryRef::getName(StringRef &Result) const {
|
||||
OwningObject->getRvaPtr(ImportTable[Index].NameRVA, IntPtr))
|
||||
return EC;
|
||||
Result = StringRef(reinterpret_cast<const char *>(IntPtr));
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code
|
||||
ImportDirectoryEntryRef::getImportLookupTableRVA(uint32_t &Result) const {
|
||||
Result = ImportTable[Index].ImportLookupTableRVA;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code
|
||||
ImportDirectoryEntryRef::getImportAddressTableRVA(uint32_t &Result) const {
|
||||
Result = ImportTable[Index].ImportAddressTableRVA;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code ImportDirectoryEntryRef::getImportLookupEntry(
|
||||
@ -1214,7 +1214,7 @@ std::error_code ImportDirectoryEntryRef::getImportLookupEntry(
|
||||
if (std::error_code EC = OwningObject->getRvaPtr(RVA, IntPtr))
|
||||
return EC;
|
||||
Result = reinterpret_cast<const import_lookup_table_entry32 *>(IntPtr);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
bool DelayImportDirectoryEntryRef::
|
||||
@ -1248,13 +1248,13 @@ std::error_code DelayImportDirectoryEntryRef::getName(StringRef &Result) const {
|
||||
if (std::error_code EC = OwningObject->getRvaPtr(Table[Index].Name, IntPtr))
|
||||
return EC;
|
||||
Result = StringRef(reinterpret_cast<const char *>(IntPtr));
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code DelayImportDirectoryEntryRef::
|
||||
getDelayImportTable(const delay_import_directory_table_entry *&Result) const {
|
||||
Result = Table;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code DelayImportDirectoryEntryRef::
|
||||
@ -1268,7 +1268,7 @@ getImportAddress(int AddrIndex, uint64_t &Result) const {
|
||||
Result = *reinterpret_cast<const ulittle64_t *>(IntPtr);
|
||||
else
|
||||
Result = *reinterpret_cast<const ulittle32_t *>(IntPtr);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
bool ExportDirectoryEntryRef::
|
||||
@ -1288,20 +1288,20 @@ std::error_code ExportDirectoryEntryRef::getDllName(StringRef &Result) const {
|
||||
OwningObject->getRvaPtr(ExportTable->NameRVA, IntPtr))
|
||||
return EC;
|
||||
Result = StringRef(reinterpret_cast<const char *>(IntPtr));
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
// Returns the starting ordinal number.
|
||||
std::error_code
|
||||
ExportDirectoryEntryRef::getOrdinalBase(uint32_t &Result) const {
|
||||
Result = ExportTable->OrdinalBase;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
// Returns the export ordinal of the current export symbol.
|
||||
std::error_code ExportDirectoryEntryRef::getOrdinal(uint32_t &Result) const {
|
||||
Result = ExportTable->OrdinalBase + Index;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
// Returns the address of the current export symbol.
|
||||
@ -1313,7 +1313,7 @@ std::error_code ExportDirectoryEntryRef::getExportRVA(uint32_t &Result) const {
|
||||
const export_address_table_entry *entry =
|
||||
reinterpret_cast<const export_address_table_entry *>(IntPtr);
|
||||
Result = entry[Index].ExportRVA;
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
// Returns the name of the current export symbol. If the symbol is exported only
|
||||
@ -1339,10 +1339,10 @@ ExportDirectoryEntryRef::getSymbolName(StringRef &Result) const {
|
||||
if (std::error_code EC = OwningObject->getRvaPtr(NamePtr[Offset], IntPtr))
|
||||
return EC;
|
||||
Result = StringRef(reinterpret_cast<const char *>(IntPtr));
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
Result = "";
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
bool ImportedSymbolRef::
|
||||
@ -1361,11 +1361,11 @@ ImportedSymbolRef::getSymbolName(StringRef &Result) const {
|
||||
if (Entry32) {
|
||||
// If a symbol is imported only by ordinal, it has no name.
|
||||
if (Entry32[Index].isOrdinal())
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
RVA = Entry32[Index].getHintNameRVA();
|
||||
} else {
|
||||
if (Entry64[Index].isOrdinal())
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
RVA = Entry64[Index].getHintNameRVA();
|
||||
}
|
||||
uintptr_t IntPtr = 0;
|
||||
@ -1373,7 +1373,7 @@ ImportedSymbolRef::getSymbolName(StringRef &Result) const {
|
||||
return EC;
|
||||
// +2 because the first two bytes is hint.
|
||||
Result = StringRef(reinterpret_cast<const char *>(IntPtr + 2));
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code ImportedSymbolRef::getOrdinal(uint16_t &Result) const {
|
||||
@ -1381,13 +1381,13 @@ std::error_code ImportedSymbolRef::getOrdinal(uint16_t &Result) const {
|
||||
if (Entry32) {
|
||||
if (Entry32[Index].isOrdinal()) {
|
||||
Result = Entry32[Index].getOrdinal();
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
RVA = Entry32[Index].getHintNameRVA();
|
||||
} else {
|
||||
if (Entry64[Index].isOrdinal()) {
|
||||
Result = Entry64[Index].getOrdinal();
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
RVA = Entry64[Index].getHintNameRVA();
|
||||
}
|
||||
@ -1395,7 +1395,7 @@ std::error_code ImportedSymbolRef::getOrdinal(uint16_t &Result) const {
|
||||
if (std::error_code EC = OwningObject->getRvaPtr(RVA, IntPtr))
|
||||
return EC;
|
||||
Result = *reinterpret_cast<const ulittle16_t *>(IntPtr);
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
ErrorOr<std::unique_ptr<COFFObjectFile>>
|
||||
@ -1432,11 +1432,11 @@ void BaseRelocRef::moveNext() {
|
||||
std::error_code BaseRelocRef::getType(uint8_t &Type) const {
|
||||
auto *Entry = reinterpret_cast<const coff_base_reloc_block_entry *>(Header + 1);
|
||||
Type = Entry[Index].getType();
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code BaseRelocRef::getRVA(uint32_t &Result) const {
|
||||
auto *Entry = reinterpret_cast<const coff_base_reloc_block_entry *>(Header + 1);
|
||||
Result = Header->PageRVA + Entry[Index].getOffset();
|
||||
return object_error::success;
|
||||
return std::error_code();
|
||||
}
|
||||
|
Reference in New Issue
Block a user