@@ -79,9 +79,44 @@ ObjectFile *ObjectFileXCOFF::CreateInstance(const lldb::ModuleSP &module_sp,
79
79
if (!objfile_up)
80
80
return nullptr ;
81
81
82
+ // Cache xcoff binary.
83
+ if (!objfile_up->CreateBinary ())
84
+ return nullptr ;
85
+
86
+ if (!objfile_up->ParseHeader ())
87
+ return nullptr ;
88
+
82
89
return objfile_up.release ();
83
90
}
84
91
92
+ bool ObjectFileXCOFF::CreateBinary () {
93
+ if (m_binary)
94
+ return true ;
95
+
96
+ Log *log = GetLog (LLDBLog::Object);
97
+
98
+ auto binary = llvm::object::ObjectFile::createObjectFile (
99
+ llvm::MemoryBufferRef (toStringRef (m_data.GetData ()),
100
+ m_file.GetFilename ().GetStringRef ()),
101
+ file_magic::xcoff_object_64);
102
+ if (!binary) {
103
+ LLDB_LOG_ERROR (log , binary.takeError (),
104
+ " Failed to create binary for file ({1}): {0}" , m_file);
105
+ return false ;
106
+ }
107
+ // Make sure we only handle XCOFF format.
108
+ m_binary =
109
+ llvm::unique_dyn_cast<llvm::object::XCOFFObjectFile>(std::move (*binary));
110
+ if (!m_binary)
111
+ return false ;
112
+
113
+ LLDB_LOG (log , " this = {0}, module = {1} ({2}), file = {3}, binary = {4}" ,
114
+ this , GetModule ().get (), GetModule ()->GetSpecificationDescription (),
115
+ m_file.GetPath (), m_binary.get ());
116
+
117
+ return true ;
118
+ }
119
+
85
120
ObjectFile *ObjectFileXCOFF::CreateMemoryInstance (
86
121
const lldb::ModuleSP &module_sp, WritableDataBufferSP data_sp,
87
122
const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) {
@@ -108,10 +143,9 @@ size_t ObjectFileXCOFF::GetModuleSpecifications(
108
143
109
144
static uint32_t XCOFFHeaderSizeFromMagic (uint32_t magic) {
110
145
switch (magic) {
111
- // TODO: 32bit not supported yet
146
+ // TODO: 32bit not supported.
112
147
// case XCOFF::XCOFF32:
113
148
// return sizeof(struct llvm::object::XCOFFFileHeader32);
114
-
115
149
case XCOFF::XCOFF64:
116
150
return sizeof (struct llvm ::object::XCOFFFileHeader64);
117
151
break ;
@@ -127,19 +161,30 @@ bool ObjectFileXCOFF::MagicBytesMatch(DataBufferSP &data_sp,
127
161
lldb::addr_t data_length) {
128
162
lldb_private::DataExtractor data;
129
163
data.SetData (data_sp, data_offset, data_length);
164
+ // Need to set this as XCOFF is only compatible with Big Endian
130
165
data.SetByteOrder (eByteOrderBig);
131
166
lldb::offset_t offset = 0 ;
132
167
uint16_t magic = data.GetU16 (&offset);
133
168
return XCOFFHeaderSizeFromMagic (magic) != 0 ;
134
169
}
135
170
136
- bool ObjectFileXCOFF::ParseHeader () { return false ; }
171
+ bool ObjectFileXCOFF::ParseHeader () {
172
+ // Only 64-bit is supported for now
173
+ return m_binary->fileHeader64 ()->Magic == XCOFF::XCOFF64;
174
+ }
137
175
138
176
ByteOrder ObjectFileXCOFF::GetByteOrder () const { return eByteOrderBig; }
139
177
140
178
bool ObjectFileXCOFF::IsExecutable () const { return true ; }
141
179
142
- uint32_t ObjectFileXCOFF::GetAddressByteSize () const { return 8 ; }
180
+ uint32_t ObjectFileXCOFF::GetAddressByteSize () const {
181
+ // 32-bit not supported. return 8 for 64-bit XCOFF::XCOFF64
182
+ return 8 ;
183
+ }
184
+
185
+ AddressClass ObjectFileXCOFF::GetAddressClass (addr_t file_addr) {
186
+ return AddressClass::eUnknown;
187
+ }
143
188
144
189
void ObjectFileXCOFF::ParseSymtab (Symtab &lldb_symtab) {}
145
190
@@ -159,7 +204,13 @@ UUID ObjectFileXCOFF::GetUUID() { return UUID(); }
159
204
160
205
uint32_t ObjectFileXCOFF::GetDependentModules (FileSpecList &files) { return 0 ; }
161
206
162
- ObjectFile::Type ObjectFileXCOFF::CalculateType () { return eTypeExecutable; }
207
+ ObjectFile::Type ObjectFileXCOFF::CalculateType () {
208
+ if (m_binary->fileHeader64 ()->Flags & XCOFF::F_EXEC)
209
+ return eTypeExecutable;
210
+ else if (m_binary->fileHeader64 ()->Flags & XCOFF::F_SHROBJ)
211
+ return eTypeSharedLibrary;
212
+ return eTypeUnknown;
213
+ }
163
214
164
215
ObjectFile::Strata ObjectFileXCOFF::CalculateStrata () { return eStrataUnknown; }
165
216
0 commit comments