diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-10-28 23:01:48 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-10-28 23:01:48 +0000 |
commit | c5253237f8b3b4eb888f7f85f39acd7d4d0f57cf (patch) | |
tree | 203b75962c5da40e7263f2ca12d9452fe602fef3 /include/llvm/DebugInfo | |
parent | 730e3c69952d4f26a0c51b55902ac55c88238ee8 (diff) | |
download | external_llvm-c5253237f8b3b4eb888f7f85f39acd7d4d0f57cf.zip external_llvm-c5253237f8b3b4eb888f7f85f39acd7d4d0f57cf.tar.gz external_llvm-c5253237f8b3b4eb888f7f85f39acd7d4d0f57cf.tar.bz2 |
DebugInfo: Introduce the notion of "form classes"
Summary:
Use DWARF4 table of form classes to fetch attributes from DIE
in a more consistent way. This shouldn't change the functionality and
serves as a refactoring for upcoming change: DW_AT_high_pc has different
semantics depending on its form class.
Reviewers: dblaikie, echristo
Reviewed By: echristo
CC: echristo, llvm-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D1961
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193553 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/DebugInfo')
-rw-r--r-- | include/llvm/DebugInfo/DWARFFormValue.h | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/include/llvm/DebugInfo/DWARFFormValue.h b/include/llvm/DebugInfo/DWARFFormValue.h index c8d6008..a9d1ec0 100644 --- a/include/llvm/DebugInfo/DWARFFormValue.h +++ b/include/llvm/DebugInfo/DWARFFormValue.h @@ -10,6 +10,7 @@ #ifndef LLVM_DEBUGINFO_DWARFFORMVALUE_H #define LLVM_DEBUGINFO_DWARFFORMVALUE_H +#include "llvm/ADT/Optional.h" #include "llvm/Support/DataExtractor.h" namespace llvm { @@ -18,6 +19,21 @@ class DWARFUnit; class raw_ostream; class DWARFFormValue { +public: + enum FormClass { + FC_Unknown, + FC_Address, + FC_Block, + FC_Constant, + FC_String, + FC_Flag, + FC_Reference, + FC_Indirect, + FC_SectionOffset, + FC_Exprloc + }; + +private: struct ValueType { ValueType() : data(NULL) { uval = 0; @@ -35,9 +51,10 @@ class DWARFFormValue { ValueType Value; // Contains all data for the form. public: - DWARFFormValue(uint16_t form = 0) : Form(form) {} + DWARFFormValue(uint16_t Form = 0) : Form(Form) {} uint16_t getForm() const { return Form; } - const ValueType& value() const { return Value; } + bool isFormClass(FormClass FC) const; + void dump(raw_ostream &OS, const DWARFUnit *U) const; bool extractValue(DataExtractor data, uint32_t *offset_ptr, const DWARFUnit *u); @@ -45,11 +62,13 @@ public: return Value.data != NULL && Value.data == (const uint8_t*)Value.cstr; } - uint64_t getReference(const DWARFUnit *U) const; - uint64_t getUnsigned() const { return Value.uval; } - int64_t getSigned() const { return Value.sval; } - const char *getAsCString(const DWARFUnit *U) const; - uint64_t getAsAddress(const DWARFUnit *U) const; + /// getAsFoo functions below return the extracted value as Foo if only + /// DWARFFormValue has form class is suitable for representing Foo. + Optional<uint64_t> getAsReference(const DWARFUnit *U) const; + Optional<uint64_t> getAsUnsignedConstant() const; + Optional<const char *> getAsCString(const DWARFUnit *U) const; + Optional<uint64_t> getAsAddress(const DWARFUnit *U) const; + Optional<uint64_t> getAsSectionOffset() const; bool skipValue(DataExtractor debug_info_data, uint32_t *offset_ptr, const DWARFUnit *u) const; |