diff options
Diffstat (limited to 'lib/Object')
| -rw-r--r-- | lib/Object/COFFObjectFile.cpp | 4 | ||||
| -rw-r--r-- | lib/Object/WasmObjectFile.cpp | 41 | 
2 files changed, 31 insertions, 14 deletions
diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index b1223e81be43..28531feccfe1 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -1062,7 +1062,7 @@ COFFObjectFile::getSectionContents(const coff_section *Sec,    // In COFF, a virtual section won't have any in-file    // content, so the file pointer to the content will be zero.    if (Sec->PointerToRawData == 0) -    return object_error::parse_failed; +    return std::error_code();    // The only thing that we need to verify is that the contents is contained    // within the file bounds. We don't need to make sure it doesn't cover other    // data, as there's nothing that says that is not allowed. @@ -1602,8 +1602,6 @@ ErrorOr<ArrayRef<UTF16>> ResourceSectionRef::getDirStringAtOffset(uint32_t Offse    uint16_t Length;    RETURN_IF_ERROR(Reader.readInteger(Length));    ArrayRef<UTF16> RawDirString; -  // Strings are stored as 2-byte aligned unicode characters but readFixedString -  // assumes byte string, so we double length.    RETURN_IF_ERROR(Reader.readArray(RawDirString, Length));    return RawDirString;  } diff --git a/lib/Object/WasmObjectFile.cpp b/lib/Object/WasmObjectFile.cpp index 39f8704aacf2..058686e4db9e 100644 --- a/lib/Object/WasmObjectFile.cpp +++ b/lib/Object/WasmObjectFile.cpp @@ -168,6 +168,13 @@ static wasm::WasmLimits readLimits(const uint8_t *&Ptr) {    return Result;  } +static wasm::WasmTable readTable(const uint8_t *&Ptr) { +  wasm::WasmTable Table; +  Table.ElemType = readVarint7(Ptr); +  Table.Limits = readLimits(Ptr); +  return Table; +} +  static Error readSection(WasmSection &Section, const uint8_t *&Ptr,                           const uint8_t *Start) {    // TODO(sbc): Avoid reading past EOF in the case of malformed files. @@ -397,13 +404,22 @@ Error WasmObjectFile::parseImportSection(const uint8_t *Ptr, const uint8_t *End)                             Sections.size(), i);        break;      case wasm::WASM_EXTERNAL_GLOBAL: -      Im.GlobalType = readVarint7(Ptr); -      Im.GlobalMutable = readVaruint1(Ptr); +      Im.Global.Type = readVarint7(Ptr); +      Im.Global.Mutable = readVaruint1(Ptr);        Symbols.emplace_back(Im.Field, WasmSymbol::SymbolType::GLOBAL_IMPORT,                             Sections.size(), i);        break; +    case wasm::WASM_EXTERNAL_MEMORY: +      Im.Memory = readLimits(Ptr); +      break; +    case wasm::WASM_EXTERNAL_TABLE: +      Im.Table = readTable(Ptr); +      if (Im.Table.ElemType != wasm::WASM_TYPE_ANYFUNC) { +        return make_error<GenericBinaryError>("Invalid table element type", +                                              object_error::parse_failed); +      } +      break;      default: -      // TODO(sbc): Handle other kinds of imports        return make_error<GenericBinaryError>(            "Unexpected import kind", object_error::parse_failed);      } @@ -431,14 +447,11 @@ Error WasmObjectFile::parseTableSection(const uint8_t *Ptr, const uint8_t *End)    uint32_t Count = readVaruint32(Ptr);    Tables.reserve(Count);    while (Count--) { -    wasm::WasmTable Table; -    Table.ElemType = readVarint7(Ptr); -    if (Table.ElemType != wasm::WASM_TYPE_ANYFUNC) { +    Tables.push_back(readTable(Ptr)); +    if (Tables.back().ElemType != wasm::WASM_TYPE_ANYFUNC) {        return make_error<GenericBinaryError>("Invalid table element type",                                              object_error::parse_failed);      } -    Table.Limits = readLimits(Ptr); -    Tables.push_back(Table);    }    if (Ptr != End)      return make_error<GenericBinaryError>("Table section ended prematurely", @@ -493,8 +506,10 @@ Error WasmObjectFile::parseExportSection(const uint8_t *Ptr, const uint8_t *End)        Symbols.emplace_back(Ex.Name, WasmSymbol::SymbolType::GLOBAL_EXPORT,                             Sections.size(), i);        break; +    case wasm::WASM_EXTERNAL_MEMORY: +    case wasm::WASM_EXTERNAL_TABLE: +      break;      default: -      // TODO(sbc): Handle other kinds of exports        return make_error<GenericBinaryError>(            "Unexpected export kind", object_error::parse_failed);      } @@ -507,7 +522,7 @@ Error WasmObjectFile::parseExportSection(const uint8_t *Ptr, const uint8_t *End)  Error WasmObjectFile::parseStartSection(const uint8_t *Ptr, const uint8_t *End) {    StartFunction = readVaruint32(Ptr); -  if (StartFunction < FunctionTypes.size()) +  if (StartFunction >= FunctionTypes.size())      return make_error<GenericBinaryError>("Invalid start function",                                            object_error::parse_failed);    return Error::success(); @@ -638,10 +653,14 @@ basic_symbol_iterator WasmObjectFile::symbol_end() const {    return BasicSymbolRef(Ref, this);  } -const WasmSymbol &WasmObjectFile::getWasmSymbol(DataRefImpl Symb) const { +const WasmSymbol &WasmObjectFile::getWasmSymbol(const DataRefImpl &Symb) const {    return Symbols[Symb.d.a];  } +const WasmSymbol &WasmObjectFile::getWasmSymbol(const SymbolRef &Symb) const { +  return getWasmSymbol(Symb.getRawDataRefImpl()); +} +  Expected<StringRef> WasmObjectFile::getSymbolName(DataRefImpl Symb) const {    const WasmSymbol &Sym = getWasmSymbol(Symb);    return Sym.Name;  | 
