Skip to content

Commit

Permalink
Add support for the notion of "hidden" relocations. On MachO, these a…
Browse files Browse the repository at this point in the history
…re relocation entries that are used as additional information for other, real relocations, rather than being relocations themselves.

I'm not familiar enough with ELF or COFF to know if they should have any relocations marked hidden.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142961 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
resistor committed Oct 25, 2011
1 parent f62333d commit 0685e94
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/llvm/Object/MachO.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ class MachOObjectFile : public ObjectFile {
int64_t &Res) const;
virtual error_code getRelocationValueString(DataRefImpl Rel,
SmallVectorImpl<char> &Result) const;
virtual error_code getRelocationHidden(DataRefImpl Rel, bool &Result) const;

private:
MachOObject *MachOObj;
Expand Down
13 changes: 13 additions & 0 deletions include/llvm/Object/ObjectFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,11 @@ class RelocationRef {
error_code getSymbol(SymbolRef &Result) const;
error_code getType(uint32_t &Result) const;

/// @brief Indicates whether this relocation should hidden when listing
/// relocations, usually because it is the trailing part of a multipart
/// relocation that will be printed as part of the leading relocation.
error_code getHidden(bool &Result) const;

/// @brief Get a string that represents the type of this relocation.
///
/// This is for display purposes only.
Expand Down Expand Up @@ -286,6 +291,10 @@ class ObjectFile : public Binary {
int64_t &Res) const = 0;
virtual error_code getRelocationValueString(DataRefImpl Rel,
SmallVectorImpl<char> &Result) const = 0;
virtual error_code getRelocationHidden(DataRefImpl Rel, bool &Result) const {
Result = false;
return object_error::success;
}

public:

Expand Down Expand Up @@ -483,6 +492,10 @@ inline error_code RelocationRef::getValueString(SmallVectorImpl<char> &Result)
return OwningObject->getRelocationValueString(RelocationPimpl, Result);
}

inline error_code RelocationRef::getHidden(bool &Result) const {
return OwningObject->getRelocationHidden(RelocationPimpl, Result);
}

} // end namespace object
} // end namespace llvm

Expand Down
32 changes: 32 additions & 0 deletions lib/Object/MachOObjectFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -952,6 +952,38 @@ error_code MachOObjectFile::getRelocationValueString(DataRefImpl Rel,
return object_error::success;
}

error_code MachOObjectFile::getRelocationHidden(DataRefImpl Rel,
bool &Result) const {
InMemoryStruct<macho::RelocationEntry> RE;
getRelocation(Rel, RE);

unsigned Type = (RE->Word1 >> 28) & 0xF;
unsigned Arch = getArch();

Result = false;

// On arches that use the generic relocations, GENERIC_RELOC_PAIR
// is always hidden.
if (Arch == Triple::x86 || Arch == Triple::arm) {
if (Type == 1) Result = true;
} else if (Arch == Triple::x86_64) {
// On x86_64, X86_64_RELOC_UNSIGNED is hidden only when it follows
// an X864_64_RELOC_SUBTRACTOR.
if (Type == 0 && Rel.d.a > 0) {
DataRefImpl RelPrev = Rel;
RelPrev.d.a--;
InMemoryStruct<macho::RelocationEntry> REPrev;
getRelocation(RelPrev, REPrev);

unsigned PrevType = (REPrev->Word1 >> 28) & 0xF;

if (PrevType == 5) Result = true;
}
}

return object_error::success;
}

/*===-- Miscellaneous -----------------------------------------------------===*/

uint8_t MachOObjectFile::getBytesInAddress() const {
Expand Down
9 changes: 9 additions & 0 deletions tools/llvm-objdump/llvm-objdump.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -301,9 +301,15 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {

// Print relocation for instruction.
while (rel_cur != rel_end) {
bool hidden = false;
uint64_t addr;
SmallString<16> name;
SmallString<32> val;

// If this relocation is hidden, skip it.
if (error(rel_cur->getHidden(hidden))) goto skip_print_rel;
if (hidden) goto skip_print_rel;

if (error(rel_cur->getAddress(addr))) goto skip_print_rel;
// Stop when rel_cur's address is past the current instruction.
if (addr >= Index + Size) break;
Expand Down Expand Up @@ -336,9 +342,12 @@ static void PrintRelocations(const ObjectFile *o) {
ri != re; ri.increment(ec)) {
if (error(ec)) return;

bool hidden;
uint64_t address;
SmallString<32> relocname;
SmallString<32> valuestr;
if (error(ri->getHidden(hidden))) continue;
if (hidden) continue;
if (error(ri->getTypeName(relocname))) continue;
if (error(ri->getAddress(address))) continue;
if (error(ri->getValueString(valuestr))) continue;
Expand Down

0 comments on commit 0685e94

Please sign in to comment.