X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FObject%2FMachOObjectFile.cpp;h=819409e3a1458e593a6d35f47cb66bccddb83ab7;hb=6bbab86af959a8819ddadfe8909bcfa5aa53ce9f;hp=b1416eae89ded54c3bb2388fb9d5f881ef22f6b2;hpb=dfa1896b6b61e708f002b814794890ff308172ee;p=oota-llvm.git diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index b1416eae89d..819409e3a14 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -30,7 +30,7 @@ namespace object { MachOObjectFile::MachOObjectFile(MemoryBuffer *Object, MachOObject *MOO, error_code &ec) - : ObjectFile(Binary::isMachO, Object, ec), + : ObjectFile(Binary::ID_MachO, Object, ec), MachOObj(MOO), RegisteredStringTable(std::numeric_limits::max()) { DataRefImpl DRI; @@ -262,61 +262,40 @@ error_code MachOObjectFile::getSymbolNMTypeChar(DataRefImpl DRI, return object_error::success; } -error_code MachOObjectFile::isSymbolInternal(DataRefImpl DRI, - bool &Result) const { +error_code MachOObjectFile::getSymbolFlags(DataRefImpl DRI, + uint32_t &Result) const { + uint16_t MachOFlags; + uint8_t MachOType; if (MachOObj->is64Bit()) { InMemoryStruct Entry; getSymbol64TableEntry(DRI, Entry); - Result = Entry->Flags & macho::STF_StabsEntryMask; + MachOFlags = Entry->Flags; + MachOType = Entry->Type; } else { InMemoryStruct Entry; getSymbolTableEntry(DRI, Entry); - Result = Entry->Flags & macho::STF_StabsEntryMask; + MachOFlags = Entry->Flags; + MachOType = Entry->Type; } - return object_error::success; -} -error_code MachOObjectFile::isSymbolGlobal(DataRefImpl Symb, bool &Res) const { + // TODO: Correctly set SF_ThreadLocal and SF_Common. + Result = SymbolRef::SF_None; - if (MachOObj->is64Bit()) { - InMemoryStruct Entry; - getSymbol64TableEntry(Symb, Entry); - Res = Entry->Type & MachO::NlistMaskExternal; - } else { - InMemoryStruct Entry; - getSymbolTableEntry(Symb, Entry); - Res = Entry->Type & MachO::NlistMaskExternal; - } - return object_error::success; -} + if ((MachOType & MachO::NlistMaskType) == MachO::NListTypeUndefined) + Result |= SymbolRef::SF_Undefined; -error_code MachOObjectFile::isSymbolWeak(DataRefImpl Symb, bool &Res) const { + if (MachOFlags & macho::STF_StabsEntryMask) + Result |= SymbolRef::SF_FormatSpecific; - if (MachOObj->is64Bit()) { - InMemoryStruct Entry; - getSymbol64TableEntry(Symb, Entry); - Res = Entry->Flags & (MachO::NListDescWeakRef | MachO::NListDescWeakDef); - } else { - InMemoryStruct Entry; - getSymbolTableEntry(Symb, Entry); - Res = Entry->Flags & (MachO::NListDescWeakRef | MachO::NListDescWeakDef); - } - return object_error::success; -} + if (MachOType & MachO::NlistMaskExternal) + Result |= SymbolRef::SF_Global; -error_code MachOObjectFile::isSymbolAbsolute(DataRefImpl Symb, bool &Res) const{ - uint8_t n_type; - if (MachOObj->is64Bit()) { - InMemoryStruct Entry; - getSymbol64TableEntry(Symb, Entry); - n_type = Entry->Type; - } else { - InMemoryStruct Entry; - getSymbolTableEntry(Symb, Entry); - n_type = Entry->Type; - } + if (MachOFlags & (MachO::NListDescWeakRef | MachO::NListDescWeakDef)) + Result |= SymbolRef::SF_Weak; + + if ((MachOType & MachO::NlistMaskType) == MachO::NListTypeAbsolute) + Result |= SymbolRef::SF_Absolute; - Res = (n_type & MachO::NlistMaskType) == MachO::NListTypeAbsolute; return object_error::success; } @@ -363,7 +342,7 @@ error_code MachOObjectFile::getSymbolType(DataRefImpl Symb, switch (n_type & MachO::NlistMaskType) { case MachO::NListTypeUndefined : - Res = SymbolRef::ST_External; + Res = SymbolRef::ST_Unknown; break; case MachO::NListTypeSection : Res = SymbolRef::ST_Function; @@ -398,6 +377,21 @@ symbol_iterator MachOObjectFile::end_dynamic_symbols() const { report_fatal_error("Dynamic symbols unimplemented in MachOObjectFile"); } +library_iterator MachOObjectFile::begin_libraries_needed() const { + // TODO: implement + report_fatal_error("Needed libraries unimplemented in MachOObjectFile"); +} + +library_iterator MachOObjectFile::end_libraries_needed() const { + // TODO: implement + report_fatal_error("Needed libraries unimplemented in MachOObjectFile"); +} + +StringRef MachOObjectFile::getLoadName() const { + // TODO: Implement + report_fatal_error("get_load_name() unimplemented in MachOObjectFile"); +} + /*===-- Sections ----------------------------------------------------------===*/ void MachOObjectFile::moveToNextSection(DataRefImpl &DRI) const { @@ -580,7 +574,7 @@ error_code MachOObjectFile::sectionContainsSymbol(DataRefImpl Sec, bool &Result) const { SymbolRef::Type ST; getSymbolType(Symb, ST); - if (ST == SymbolRef::ST_External) { + if (ST == SymbolRef::ST_Unknown) { Result = false; return object_error::success; } @@ -1196,6 +1190,17 @@ error_code MachOObjectFile::getRelocationHidden(DataRefImpl Rel, return object_error::success; } +error_code MachOObjectFile::getLibraryNext(DataRefImpl LibData, + LibraryRef &Res) const { + report_fatal_error("Needed libraries unimplemented in MachOObjectFile"); +} + +error_code MachOObjectFile::getLibraryPath(DataRefImpl LibData, + StringRef &Res) const { + report_fatal_error("Needed libraries unimplemented in MachOObjectFile"); +} + + /*===-- Miscellaneous -----------------------------------------------------===*/ uint8_t MachOObjectFile::getBytesInAddress() const {