diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-02-05 01:55:49 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-02-05 01:55:49 +0000 |
commit | 408b5e660300f96d9a231ba0e18e75d8e69d17bb (patch) | |
tree | e9209cea4a29570a15cbcdb349cf6413b453e3aa /llvm/lib/MC/MCFragment.cpp | |
parent | adc2376375f32b96daa8c548b11237738945f623 (diff) | |
download | llvm-408b5e660300f96d9a231ba0e18e75d8e69d17bb.zip llvm-408b5e660300f96d9a231ba0e18e75d8e69d17bb.tar.gz llvm-408b5e660300f96d9a231ba0e18e75d8e69d17bb.tar.bz2 |
[MC] Add support for encoding CodeView variable definition ranges
CodeView, like most other debug formats, represents the live range of a
variable so that debuggers might print them out.
They use a variety of records to represent how a particular variable
might be available (in a register, in a frame pointer, etc.) along with
a set of ranges where this debug information is relevant.
However, the format only allows us to use ranges which are limited to a
maximum of 0xF000 in size. This means that we need to split our debug
information into chunks of 0xF000.
Because the layout of code is not known until *very* late, we must use a
new fragment to record the information we need until we can know
*exactly* what the range is.
llvm-svn: 259868
Diffstat (limited to 'llvm/lib/MC/MCFragment.cpp')
-rw-r--r-- | llvm/lib/MC/MCFragment.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCFragment.cpp b/llvm/lib/MC/MCFragment.cpp index bfadfda..b9889049 100644 --- a/llvm/lib/MC/MCFragment.cpp +++ b/llvm/lib/MC/MCFragment.cpp @@ -292,6 +292,9 @@ void MCFragment::destroy() { case FT_CVInlineLines: delete cast<MCCVInlineLineTableFragment>(this); return; + case FT_CVDefRange: + delete cast<MCCVDefRangeFragment>(this); + return; case FT_Dummy: delete cast<MCDummyFragment>(this); return; @@ -331,6 +334,7 @@ LLVM_DUMP_METHOD void MCFragment::dump() { case MCFragment::FT_LEB: OS << "MCLEBFragment"; break; case MCFragment::FT_SafeSEH: OS << "MCSafeSEHFragment"; break; case MCFragment::FT_CVInlineLines: OS << "MCCVInlineLineTableFragment"; break; + case MCFragment::FT_CVDefRange: OS << "MCCVDefRangeTableFragment"; break; case MCFragment::FT_Dummy: OS << "MCDummyFragment"; break; } @@ -435,6 +439,16 @@ LLVM_DUMP_METHOD void MCFragment::dump() { OS << " Sym:" << *F->getFnStartSym(); break; } + case MCFragment::FT_CVDefRange: { + const auto *F = cast<MCCVDefRangeFragment>(this); + OS << "\n "; + for (std::pair<const MCSymbol *, const MCSymbol *> RangeStartEnd : + F->getRanges()) { + OS << " RangeStart:" << RangeStartEnd.first; + OS << " RangeEnd:" << RangeStartEnd.second; + } + break; + } case MCFragment::FT_Dummy: break; } |