diff options
| author | Benjamin Kramer <benny.kra@googlemail.com> | 2011-07-15 00:14:48 +0000 | 
|---|---|---|
| committer | Benjamin Kramer <benny.kra@googlemail.com> | 2011-07-15 00:14:48 +0000 | 
| commit | 56498d167ae7e0c2f8f3309742c87d24efca8e62 (patch) | |
| tree | 3f555258bc7c0f70fc3875f9dcbc4098661c95e8 /llvm/lib | |
| parent | b1d80722a8bd7c81017ed68e68f74ed9b2004932 (diff) | |
| download | bcm5719-llvm-56498d167ae7e0c2f8f3309742c87d24efca8e62.tar.gz bcm5719-llvm-56498d167ae7e0c2f8f3309742c87d24efca8e62.zip  | |
Add support for 64 bit objects to MachOObjectFile.
- I don't see a better way than duplicating all the code.
llvm-svn: 135229
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Object/MachOObjectFile.cpp | 98 | 
1 files changed, 77 insertions, 21 deletions
diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 37edefe99fa..daf85b16a90 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -70,6 +70,8 @@ private:                             InMemoryStruct<macho::SymbolTableEntry> &Res) const;    void moveToNextSymbol(DataRefImpl &DRI) const;    void getSection(DataRefImpl DRI, InMemoryStruct<macho::Section> &Res) const; +  void getSection64(DataRefImpl DRI, +                    InMemoryStruct<macho::Section64> &Res) const;  };  ObjectFile *ObjectFile::createMachOObjectFile(MemoryBuffer *Buffer) { @@ -234,51 +236,105 @@ MachOObjectFile::getSection(DataRefImpl DRI,    MachOObj->ReadSection(LCI, DRI.d.b, Res);  } -error_code MachOObjectFile::getSectionName(DataRefImpl DRI, -                                           StringRef &Result) const { -  InMemoryStruct<macho::SegmentLoadCommand> SLC; +void +MachOObjectFile::getSection64(DataRefImpl DRI, +                            InMemoryStruct<macho::Section64> &Res) const { +  InMemoryStruct<macho::Segment64LoadCommand> SLC;    LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); -  MachOObj->ReadSegmentLoadCommand(LCI, SLC); -  InMemoryStruct<macho::Section> Sect; -  MachOObj->ReadSection(LCI, DRI.d.b, Sect); +  MachOObj->ReadSegment64LoadCommand(LCI, SLC); +  MachOObj->ReadSection64(LCI, DRI.d.b, Res); +} +static bool is64BitLoadCommand(const MachOObject *MachOObj, DataRefImpl DRI) { +  LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); +  if (LCI.Command.Type == macho::LCT_Segment64) +    return true; +  assert(LCI.Command.Type == macho::LCT_Segment && "Unexpected Type."); +  return false; +} + +error_code MachOObjectFile::getSectionName(DataRefImpl DRI, +                                           StringRef &Result) const { +  // FIXME: thread safety.    static char result[34]; -  strcpy(result, SLC->Name); -  strcat(result, ","); -  strcat(result, Sect->Name); +  if (is64BitLoadCommand(MachOObj, DRI)) { +    InMemoryStruct<macho::Segment64LoadCommand> SLC; +    LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); +    MachOObj->ReadSegment64LoadCommand(LCI, SLC); +    InMemoryStruct<macho::Section64> Sect; +    MachOObj->ReadSection64(LCI, DRI.d.b, Sect); + +    strcpy(result, SLC->Name); +    strcat(result, ","); +    strcat(result, Sect->Name); +  } else { +    InMemoryStruct<macho::SegmentLoadCommand> SLC; +    LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); +    MachOObj->ReadSegmentLoadCommand(LCI, SLC); +    InMemoryStruct<macho::Section> Sect; +    MachOObj->ReadSection(LCI, DRI.d.b, Sect); + +    strcpy(result, SLC->Name); +    strcat(result, ","); +    strcat(result, Sect->Name); +  }    Result = StringRef(result);    return object_error::success;  }  error_code MachOObjectFile::getSectionAddress(DataRefImpl DRI,                                                uint64_t &Result) const { -  InMemoryStruct<macho::Section> Sect; -  getSection(DRI, Sect); -  Result = Sect->Address; +  if (is64BitLoadCommand(MachOObj, DRI)) { +    InMemoryStruct<macho::Section64> Sect; +    getSection64(DRI, Sect); +    Result = Sect->Address; +  } else { +    InMemoryStruct<macho::Section> Sect; +    getSection(DRI, Sect); +    Result = Sect->Address; +  }    return object_error::success;  }  error_code MachOObjectFile::getSectionSize(DataRefImpl DRI,                                             uint64_t &Result) const { -  InMemoryStruct<macho::Section> Sect; -  getSection(DRI, Sect); -  Result = Sect->Size; +  if (is64BitLoadCommand(MachOObj, DRI)) { +    InMemoryStruct<macho::Section64> Sect; +    getSection64(DRI, Sect); +    Result = Sect->Size; +  } else { +    InMemoryStruct<macho::Section> Sect; +    getSection(DRI, Sect); +    Result = Sect->Size; +  }    return object_error::success;  }  error_code MachOObjectFile::getSectionContents(DataRefImpl DRI,                                                 StringRef &Result) const { -  InMemoryStruct<macho::Section> Sect; -  getSection(DRI, Sect); -  Result = MachOObj->getData(Sect->Offset, Sect->Size); +  if (is64BitLoadCommand(MachOObj, DRI)) { +    InMemoryStruct<macho::Section64> Sect; +    getSection64(DRI, Sect); +    Result = MachOObj->getData(Sect->Offset, Sect->Size); +  } else { +    InMemoryStruct<macho::Section> Sect; +    getSection(DRI, Sect); +    Result = MachOObj->getData(Sect->Offset, Sect->Size); +  }    return object_error::success;  }  error_code MachOObjectFile::isSectionText(DataRefImpl DRI,                                            bool &Result) const { -  InMemoryStruct<macho::Section> Sect; -  getSection(DRI, Sect); -  Result = !strcmp(Sect->Name, "__text"); +  if (is64BitLoadCommand(MachOObj, DRI)) { +    InMemoryStruct<macho::Section64> Sect; +    getSection64(DRI, Sect); +    Result = !strcmp(Sect->Name, "__text"); +  } else { +    InMemoryStruct<macho::Section> Sect; +    getSection(DRI, Sect); +    Result = !strcmp(Sect->Name, "__text"); +  }    return object_error::success;  }  | 

