MCLinker upstream commit 9628cfb76b5a.
Change-Id: I6d12c63bdae94299558dc1cf42b489bb98748851
diff --git a/lib/LD/EhFrame.cpp b/lib/LD/EhFrame.cpp
index 4a84b00..bc5ed1d 100644
--- a/lib/LD/EhFrame.cpp
+++ b/lib/LD/EhFrame.cpp
@@ -6,13 +6,16 @@
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
+
#include <mcld/LD/EhFrame.h>
-#include <mcld/MC/MCLinker.h>
-#include <mcld/Support/MsgHandling.h>
-#include <mcld/Target/TargetLDBackend.h>
+
#include <llvm/Support/Dwarf.h>
#include <llvm/Support/Host.h>
+#include <mcld/MC/MCLinker.h>
+#include <mcld/Target/TargetLDBackend.h>
+#include <mcld/Support/MsgHandling.h>
+
using namespace mcld;
//==========================
@@ -27,7 +30,7 @@
uint64_t EhFrame::readEhFrame(Layout& pLayout,
const TargetLDBackend& pBackend,
- llvm::MCSectionData& pSD,
+ SectionData& pSD,
const Input& pInput,
LDSection& pSection,
MemoryArea& pArea)
@@ -36,7 +39,6 @@
pInput.fileOffset() + pSection.offset(), pSection.size());
// an empty .eh_frame
if (NULL == region) {
- note(diag::note_ehframe) << "an empty eh_frame";
return 0;
}
@@ -50,13 +52,12 @@
// This CIE is a terminator if the Length field is 0, return 0 to handled it
// as an ordinary input.
if (0 == len) {
- note(diag::note_ehframe) << "a terminator";
pArea.release(region);
return 0;
}
if (0xffffffff == len) {
- debug(diag::debug_eh_unsupport) << "64-bit eh_frame";
+ debug(diag::debug_eh_unsupport) << pInput.name();
pArea.release(region);
m_fCanRecognizeAll = false;
return 0;
@@ -68,7 +69,7 @@
while (p < eh_end) {
if (eh_end - p < 4) {
- debug(diag::debug_eh_unsupport) << "CIE or FDE size smaller than 4";
+ debug(diag::debug_eh_unsupport) << pInput.name();
m_fCanRecognizeAll = false;
break;
}
@@ -79,20 +80,19 @@
// the zero length entry should be the end of the section
if (0 == len) {
if (p < eh_end) {
- debug(diag::debug_eh_unsupport) << "Non-end entry with zero length";
+ debug(diag::debug_eh_unsupport) << pInput.name();
m_fCanRecognizeAll = false;
}
break;
}
if (0xffffffff == len) {
- debug(diag::debug_eh_unsupport) << "64-bit eh_frame";
+ debug(diag::debug_eh_unsupport) << pInput.name();
m_fCanRecognizeAll = false;
break;
}
if (eh_end - p < 4) {
- debug(diag::debug_eh_unsupport) <<
- "CIE:ID field / FDE: CIE Pointer field";
+ debug(diag::debug_eh_unsupport) << pInput.name();
m_fCanRecognizeAll = false;
break;
}
@@ -127,6 +127,7 @@
}
if (!m_fCanRecognizeAll) {
+ debug(diag::debug_eh_unsupport) << pInput.name();
pArea.release(region);
deleteFragments(frag_list, pArea);
return 0;
@@ -156,7 +157,6 @@
// the version should be 1
if (1 != *p) {
- debug(diag::debug_eh_unsupport) << "CIE version";
return false;
}
++p;
@@ -171,17 +171,14 @@
// skip the Code Alignment Factor
if (!skipLEB128(&p, cie_end)) {
- debug(diag::debug_eh_unsupport) << "unrecognized Code Alignment Factor";
return false;
}
// skip the Data Alignment Factor
if (!skipLEB128(&p, cie_end)) {
- debug(diag::debug_eh_unsupport) << "unrecognized Data Alignment Factor";
return false;
}
// skip the Return Address Register
if (cie_end - p < 1) {
- debug(diag::debug_eh_unsupport) << "unrecognized Return Address Register";
return false;
}
++p;
@@ -189,7 +186,6 @@
// the Augmentation String start with 'eh' is a CIE from gcc before 3.0,
// in LSB Core Spec 3.0RC1. We do not support it.
if (aug_str[0] == 'e' && aug_str[1] == 'h') {
- debug(diag::debug_eh_unsupport) << "augmentation string `eh`";
return false;
}
@@ -203,21 +199,17 @@
// skip the Augumentation Data Length
if (!skipLEB128(&p, cie_end)) {
- debug(diag::debug_eh_unsupport) <<
- "unrecognized Augmentation Data Length";
return false;
}
while (aug_str != aug_str_end) {
switch (*aug_str) {
default:
- debug(diag::debug_eh_unsupport) << "augmentation string";
return false;
// LDSA encoding (1 byte)
case 'L':
if (cie_end - p < 1) {
- debug(diag::debug_eh_unsupport) << "augmentation string `L`";
return false;
}
++p;
@@ -229,7 +221,6 @@
case 'P': {
// the first argument
if (cie_end - p < 1) {
- debug(diag::debug_eh_unsupport) << "augmentation string `P`";
return false;
}
uint8_t per_encode = *p;
@@ -237,12 +228,10 @@
// get the length of the second argument
uint32_t per_length = 0;
if (0x60 == (per_encode & 0x60)) {
- debug(diag::debug_eh_unsupport) << "augmentation string `P`";
return false;
}
switch (per_encode & 7) {
default:
- debug(diag::debug_eh_unsupport) << "augmentation string `P`";
return false;
case llvm::dwarf::DW_EH_PE_udata2:
per_length = 2;
@@ -263,14 +252,12 @@
per_align += per_length - 1;
per_align &= ~(per_length -1);
if (static_cast<uint32_t>(cie_end - p) < per_align) {
- debug(diag::debug_eh_unsupport) << "augmentation string `P`";
return false;
}
p += per_align;
}
// skip the second argument
if (static_cast<uint32_t>(cie_end - p) < per_length) {
- debug(diag::debug_eh_unsupport) << "augmentation string `P`";
return false;
}
p += per_length;
@@ -280,7 +267,6 @@
// FDE encoding (1 byte)
case 'R':
if (cie_end - p < 1) {
- debug(diag::debug_eh_unsupport) << "augmentation string `R`";
return false;
}
fde_encoding = *p;
@@ -291,7 +277,6 @@
case llvm::dwarf::DW_EH_PE_absptr:
break;
default:
- debug(diag::debug_eh_unsupport) << "FDE encoding";
return false;
}
++p;
@@ -309,7 +294,7 @@
// create and push back the CIE entry
CIE* entry = new CIE(pRegion, fde_encoding);
m_CIEs.push_back(entry);
- pFragList.push_back(static_cast<llvm::MCFragment*>(entry));
+ pFragList.push_back(static_cast<Fragment*>(entry));
return true;
}
@@ -326,7 +311,6 @@
// get the entry offset of the PC Begin
if (fde_end - p < 1) {
- debug(diag::debug_eh_unsupport) << "FDE PC Begin";
return false;
}
FDE::Offset pc_offset = static_cast<FDE::Offset>(p - fde_start);
@@ -335,7 +319,7 @@
// create and push back the FDE entry
FDE* entry = new FDE(pRegion, **(m_CIEs.end() -1), pc_offset);
m_FDEs.push_back(entry);
- pFragList.push_back(static_cast<llvm::MCFragment*>(entry));
+ pFragList.push_back(static_cast<Fragment*>(entry));
return true;
}
@@ -363,9 +347,9 @@
void EhFrame::deleteFragments(FragListType& pList, MemoryArea& pArea)
{
- MCRegionFragment* frag = NULL;
+ RegionFragment* frag = NULL;
for (FragListType::iterator it = pList.begin(); it != pList.end(); ++it) {
- frag = static_cast<MCRegionFragment*>(*it);
+ frag = static_cast<RegionFragment*>(*it);
pArea.release(&(frag->getRegion()));
delete *it;
}