aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/MC/MCFragment.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-02-05 01:55:49 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-02-05 01:55:49 +0000
commit408b5e660300f96d9a231ba0e18e75d8e69d17bb (patch)
treee9209cea4a29570a15cbcdb349cf6413b453e3aa /llvm/lib/MC/MCFragment.cpp
parentadc2376375f32b96daa8c548b11237738945f623 (diff)
downloadllvm-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.cpp14
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;
}