1e4446923SMichael J. Spencer //===- Error.cpp - system_error extensions for Object -----------*- C++ -*-===// 2e4446923SMichael J. Spencer // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e4446923SMichael J. Spencer // 7e4446923SMichael J. Spencer //===----------------------------------------------------------------------===// 8e4446923SMichael J. Spencer // 9e4446923SMichael J. Spencer // This defines a new error_category for the Object library. 10e4446923SMichael J. Spencer // 11e4446923SMichael J. Spencer //===----------------------------------------------------------------------===// 12e4446923SMichael J. Spencer 13e4446923SMichael J. Spencer #include "llvm/Object/Error.h" 14df813dc0SSimon Pilgrim #include "llvm/ADT/Twine.h" 15e4446923SMichael J. Spencer #include "llvm/Support/ErrorHandling.h" 16e4446923SMichael J. Spencer 17e4446923SMichael J. Spencer using namespace llvm; 18e4446923SMichael J. Spencer using namespace object; 19e4446923SMichael J. Spencer 20e4446923SMichael J. Spencer namespace { 214718f8b5SPeter Collingbourne // FIXME: This class is only here to support the transition to llvm::Error. It 224718f8b5SPeter Collingbourne // will be removed once this transition is complete. Clients should prefer to 234718f8b5SPeter Collingbourne // deal with the Error value directly, rather than converting to error_code. 2425188c95SRafael Espindola class _object_error_category : public std::error_category { 25e4446923SMichael J. Spencer public: 26990504e6SReid Kleckner const char* name() const noexcept override; 27e3bfdc4eSJustin Bogner std::string message(int ev) const override; 28e4446923SMichael J. Spencer }; 29e4446923SMichael J. Spencer } 30e4446923SMichael J. Spencer name() const31990504e6SReid Klecknerconst char *_object_error_category::name() const noexcept { 32e4446923SMichael J. Spencer return "llvm.object"; 33e4446923SMichael J. Spencer } 34e4446923SMichael J. Spencer message(int EV) const35e00fec8fSRafael Espindolastd::string _object_error_category::message(int EV) const { 36e00fec8fSRafael Espindola object_error E = static_cast<object_error>(EV); 37e107ade3SRafael Espindola switch (E) { 38e6388e62SAlexey Samsonov case object_error::arch_not_found: 39e6388e62SAlexey Samsonov return "No object file for requested architecture"; 40e4446923SMichael J. Spencer case object_error::invalid_file_type: 41e4446923SMichael J. Spencer return "The file was not recognized as a valid object file"; 42e4446923SMichael J. Spencer case object_error::parse_failed: 43e4446923SMichael J. Spencer return "Invalid data was encountered while parsing the file"; 441d6167fdSMichael J. Spencer case object_error::unexpected_eof: 451d6167fdSMichael J. Spencer return "The end of the file was unexpectedly encountered"; 466a1bfb2fSRafael Espindola case object_error::string_table_non_null_end: 476a1bfb2fSRafael Espindola return "String table must end with a null terminator"; 486def3042SRafael Espindola case object_error::invalid_section_index: 496def3042SRafael Espindola return "Invalid section index"; 5010039c02SPeter Collingbourne case object_error::bitcode_section_not_found: 5110039c02SPeter Collingbourne return "Bitcode section not found in object file"; 52e1924f06SGeorge Rimar case object_error::invalid_symbol_index: 53e1924f06SGeorge Rimar return "Invalid symbol index"; 54bb94611dSAlvin Wong case object_error::section_stripped: 55bb94611dSAlvin Wong return "Section has been stripped from the object file"; 56e107ade3SRafael Espindola } 57e4446923SMichael J. Spencer llvm_unreachable("An enumerator of object_error does not have a message " 58e4446923SMichael J. Spencer "defined."); 59e4446923SMichael J. Spencer } 60e4446923SMichael J. Spencer anchor()61a87b70d1SRichard Trieuvoid BinaryError::anchor() {} 629e964f37SLang Hames char BinaryError::ID = 0; 639e964f37SLang Hames char GenericBinaryError::ID = 0; 649e964f37SLang Hames GenericBinaryError(const Twine & Msg)65df813dc0SSimon PilgrimGenericBinaryError::GenericBinaryError(const Twine &Msg) : Msg(Msg.str()) {} 669e964f37SLang Hames GenericBinaryError(const Twine & Msg,object_error ECOverride)67df813dc0SSimon PilgrimGenericBinaryError::GenericBinaryError(const Twine &Msg, 68df813dc0SSimon Pilgrim object_error ECOverride) 69d4e075beSKevin Enderby : Msg(Msg.str()) { 709e964f37SLang Hames setErrorCode(make_error_code(ECOverride)); 719e964f37SLang Hames } 729e964f37SLang Hames log(raw_ostream & OS) const739e964f37SLang Hamesvoid GenericBinaryError::log(raw_ostream &OS) const { 74d4e075beSKevin Enderby OS << Msg; 759e964f37SLang Hames } 769e964f37SLang Hames object_category()7725188c95SRafael Espindolaconst std::error_category &object::object_category() { 78*ede60037SNicolai Hähnle static _object_error_category error_category; 79*ede60037SNicolai Hähnle return error_category; 80e4446923SMichael J. Spencer } 818a63b2afSLang Hames isNotObjectErrorInvalidFileType(llvm::Error Err)828a63b2afSLang Hamesllvm::Error llvm::object::isNotObjectErrorInvalidFileType(llvm::Error Err) { 83327db23bSFangrui Song return handleErrors(std::move(Err), [](std::unique_ptr<ECError> M) -> Error { 848a63b2afSLang Hames // Try to handle 'M'. If successful, return a success value from 858a63b2afSLang Hames // the handler. 868a63b2afSLang Hames if (M->convertToErrorCode() == object_error::invalid_file_type) 878a63b2afSLang Hames return Error::success(); 888a63b2afSLang Hames 898a63b2afSLang Hames // We failed to handle 'M' - return it from the handler. 908a63b2afSLang Hames // This value will be passed back from catchErrors and 918a63b2afSLang Hames // wind up in Err2, where it will be returned from this function. 928a63b2afSLang Hames return Error(std::move(M)); 93327db23bSFangrui Song }); 948a63b2afSLang Hames } 95