[lldb] Introduce "RegInfoBasedABI"

Summary:
This patch creates a new subclass of the ABI class in order to abstract away the
mechanism in which we "augment" register information. This enables alternate
augmentation strategies to be introduced.

All existing ABI classes have been modified to inherit from RegInfoBasedABI, but
they will be refactored in subsequent patches.

Reviewers: JDevlieghere, jasonmolenda

Subscribers: sdardis, nemanjai, kbarton, jrtc27, atanasyan, jsji, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D74243
This commit is contained in:
Pavel Labath 2020-02-02 10:27:40 +01:00
parent 32176133fa
commit 12e32d32d3
17 changed files with 45 additions and 93 deletions

View File

@ -126,7 +126,7 @@ public:
llvm::MCRegisterInfo &GetMCRegisterInfo() { return *m_mc_register_info_up; }
virtual void AugmentRegisterInfo(RegisterInfo &info);
virtual void AugmentRegisterInfo(RegisterInfo &info) = 0;
virtual bool GetPointerReturnRegister(const char *&name) { return false; }
@ -138,10 +138,6 @@ protected:
assert(m_mc_register_info_up && "ABI must have MCRegisterInfo");
}
bool GetRegisterInfoByName(ConstString name, RegisterInfo &info);
virtual const RegisterInfo *GetRegisterInfoArray(uint32_t &count) = 0;
/// Utility function to construct a MCRegisterInfo using the ArchSpec triple.
/// Plugins wishing to customize the construction can construct the
/// MCRegisterInfo themselves.
@ -155,6 +151,18 @@ private:
DISALLOW_COPY_AND_ASSIGN(ABI);
};
class RegInfoBasedABI : public ABI {
public:
void AugmentRegisterInfo(RegisterInfo &info) override;
protected:
using ABI::ABI;
bool GetRegisterInfoByName(ConstString name, RegisterInfo &info);
virtual const RegisterInfo *GetRegisterInfoArray(uint32_t &count) = 0;
};
} // namespace lldb_private
#endif // liblldb_ABI_h_

View File

@ -13,7 +13,7 @@
#include "lldb/Utility/ConstString.h"
#include "lldb/lldb-private.h"
class ABIMacOSX_arm64 : public lldb_private::ABI {
class ABIMacOSX_arm64 : public lldb_private::RegInfoBasedABI {
public:
~ABIMacOSX_arm64() override = default;
@ -93,11 +93,7 @@ protected:
lldb_private::CompilerType &ast_type) const override;
private:
ABIMacOSX_arm64(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABIMacOSX_arm64_h_

View File

@ -12,7 +12,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABISysV_arm64 : public lldb_private::ABI {
class ABISysV_arm64 : public lldb_private::RegInfoBasedABI {
public:
~ABISysV_arm64() override = default;
@ -92,11 +92,7 @@ protected:
lldb_private::CompilerType &ast_type) const override;
private:
ABISysV_arm64(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABISysV_arm64_h_

View File

@ -16,7 +16,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABISysV_arc : public lldb_private::ABI {
class ABISysV_arc : public lldb_private::RegInfoBasedABI {
public:
~ABISysV_arc() override = default;
@ -97,7 +97,7 @@ private:
bool IsRegisterFileReduced(lldb_private::RegisterContext &reg_ctx) const;
using lldb_private::ABI::ABI; // Call CreateInstance instead.
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
using RegisterFileFlag = llvm::Optional<bool>;
mutable RegisterFileFlag m_is_reg_file_reduced;

View File

@ -12,7 +12,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABIMacOSX_arm : public lldb_private::ABI {
class ABIMacOSX_arm : public lldb_private::RegInfoBasedABI {
public:
~ABIMacOSX_arm() override = default;
@ -85,11 +85,7 @@ protected:
lldb_private::CompilerType &ast_type) const override;
private:
ABIMacOSX_arm(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABIMacOSX_arm_h_

View File

@ -12,7 +12,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABISysV_arm : public lldb_private::ABI {
class ABISysV_arm : public lldb_private::RegInfoBasedABI {
public:
~ABISysV_arm() override = default;
@ -85,11 +85,7 @@ protected:
lldb_private::CompilerType &ast_type) const override;
private:
ABISysV_arm(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABISysV_arm_h_

View File

@ -13,7 +13,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABISysV_hexagon : public lldb_private::ABI {
class ABISysV_hexagon : public lldb_private::RegInfoBasedABI {
public:
~ABISysV_hexagon() override = default;
@ -97,11 +97,7 @@ protected:
bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
private:
ABISysV_hexagon(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABISysV_hexagon_h_

View File

@ -12,7 +12,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABISysV_mips : public lldb_private::ABI {
class ABISysV_mips : public lldb_private::RegInfoBasedABI {
public:
~ABISysV_mips() override = default;
@ -87,11 +87,7 @@ protected:
bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
private:
ABISysV_mips(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABISysV_mips_h_

View File

@ -12,7 +12,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABISysV_mips64 : public lldb_private::ABI {
class ABISysV_mips64 : public lldb_private::RegInfoBasedABI {
public:
~ABISysV_mips64() override = default;
@ -100,11 +100,7 @@ protected:
bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
private:
ABISysV_mips64(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABISysV_mips64_h_

View File

@ -12,7 +12,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABISysV_ppc : public lldb_private::ABI {
class ABISysV_ppc : public lldb_private::RegInfoBasedABI {
public:
~ABISysV_ppc() override = default;
@ -96,11 +96,7 @@ protected:
bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
private:
ABISysV_ppc(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABISysV_ppc_h_

View File

@ -12,7 +12,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABISysV_ppc64 : public lldb_private::ABI {
class ABISysV_ppc64 : public lldb_private::RegInfoBasedABI {
public:
~ABISysV_ppc64() override = default;
@ -96,11 +96,7 @@ protected:
bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
private:
ABISysV_ppc64(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
lldb::ByteOrder GetByteOrder() const;
};

View File

@ -12,7 +12,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABISysV_s390x : public lldb_private::ABI {
class ABISysV_s390x : public lldb_private::RegInfoBasedABI {
public:
~ABISysV_s390x() override = default;
@ -88,11 +88,7 @@ protected:
bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
private:
ABISysV_s390x(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABISysV_s390x_h_

View File

@ -13,7 +13,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABIMacOSX_i386 : public lldb_private::ABI {
class ABIMacOSX_i386 : public lldb_private::RegInfoBasedABI {
public:
~ABIMacOSX_i386() override = default;
@ -92,11 +92,7 @@ protected:
bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
private:
ABIMacOSX_i386(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABIMacOSX_i386_h_

View File

@ -12,7 +12,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABISysV_i386 : public lldb_private::ABI {
class ABISysV_i386 : public lldb_private::RegInfoBasedABI {
public:
~ABISysV_i386() override = default;
@ -100,11 +100,7 @@ protected:
bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
private:
ABISysV_i386(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABISysV_i386_h_

View File

@ -12,7 +12,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABISysV_x86_64 : public lldb_private::ABI {
class ABISysV_x86_64 : public lldb_private::RegInfoBasedABI {
public:
~ABISysV_x86_64() override = default;
@ -98,11 +98,7 @@ protected:
bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
private:
ABISysV_x86_64(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABISysV_x86_64_h_

View File

@ -12,7 +12,7 @@
#include "lldb/Target/ABI.h"
#include "lldb/lldb-private.h"
class ABIWindows_x86_64 : public lldb_private::ABI {
class ABIWindows_x86_64 : public lldb_private::RegInfoBasedABI {
public:
~ABIWindows_x86_64() override = default;
@ -91,11 +91,7 @@ protected:
bool RegisterIsCalleeSaved(const lldb_private::RegisterInfo *reg_info);
private:
ABIWindows_x86_64(lldb::ProcessSP process_sp,
std::unique_ptr<llvm::MCRegisterInfo> info_up)
: lldb_private::ABI(std::move(process_sp), std::move(info_up)) {
// Call CreateInstance instead.
}
using lldb_private::RegInfoBasedABI::RegInfoBasedABI; // Call CreateInstance instead.
};
#endif // liblldb_ABISysV_x86_64_h_

View File

@ -41,7 +41,7 @@ ABI::FindPlugin(lldb::ProcessSP process_sp, const ArchSpec &arch) {
ABI::~ABI() = default;
bool ABI::GetRegisterInfoByName(ConstString name, RegisterInfo &info) {
bool RegInfoBasedABI::GetRegisterInfoByName(ConstString name, RegisterInfo &info) {
uint32_t count = 0;
const RegisterInfo *register_info_array = GetRegisterInfoArray(count);
if (register_info_array) {
@ -212,7 +212,7 @@ std::unique_ptr<llvm::MCRegisterInfo> ABI::MakeMCRegisterInfo(const ArchSpec &ar
return info_up;
}
void ABI::AugmentRegisterInfo(RegisterInfo &info) {
void RegInfoBasedABI::AugmentRegisterInfo(RegisterInfo &info) {
if (info.kinds[eRegisterKindEHFrame] != LLDB_INVALID_REGNUM &&
info.kinds[eRegisterKindDWARF] != LLDB_INVALID_REGNUM)
return;