[llvm-commits] [llvm] r96093 - in /llvm/trunk: include/llvm/MC/MCAssembler.h lib/MC/MCAssembler.cpp
Daniel Dunbar
daniel at zuster.org
Sat Feb 13 01:28:43 PST 2010
Author: ddunbar
Date: Sat Feb 13 03:28:43 2010
New Revision: 96093
URL: http://llvm.org/viewvc/llvm-project?rev=96093&view=rev
Log:
MCAssembler: Sink fixup list into MCDataFragment.
Modified:
llvm/trunk/include/llvm/MC/MCAssembler.h
llvm/trunk/lib/MC/MCAssembler.cpp
Modified: llvm/trunk/include/llvm/MC/MCAssembler.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAssembler.h?rev=96093&r1=96092&r2=96093&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCAssembler.h (original)
+++ llvm/trunk/include/llvm/MC/MCAssembler.h Sat Feb 13 03:28:43 2010
@@ -55,10 +55,6 @@
void operator=(const MCFragment&); // DO NOT IMPLEMENT
public:
- typedef std::vector<MCAsmFixup>::const_iterator const_fixup_iterator;
- typedef std::vector<MCAsmFixup>::iterator fixup_iterator;
-
-public:
enum FragmentType {
FT_Data,
FT_Align,
@@ -85,11 +81,6 @@
/// FileSize - The file size of this section. This is ~0 until initialized.
uint64_t FileSize;
- /// Fixups - The list of fixups in this fragment.
- //
- // FIXME: This should be sunk into MCDataFragment.
- std::vector<MCAsmFixup> Fixups;
-
/// @}
protected:
@@ -111,36 +102,6 @@
return 0;
}
- /// @name Fixup Access
- /// @{
-
- /// LookupFixup - Look up the fixup for the given \arg Fragment and \arg
- /// Offset.
- ///
- /// If multiple fixups exist for the same fragment and offset it is undefined
- /// which one is returned.
- //
- // FIXME: This isn't horribly slow in practice, but there are much nicer
- // solutions to applying the fixups. This will be fixed by sinking fixups into
- // data fragments exclusively.
- const MCAsmFixup *LookupFixup(uint64_t Offset) const {
- for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
- if (Fixups[i].Offset == Offset)
- return &Fixups[i];
- return 0;
- }
-
- std::vector<MCAsmFixup> &getFixups() { return Fixups; }
- const std::vector<MCAsmFixup> &getFixups() const { return Fixups; }
-
- fixup_iterator fixup_begin() { return Fixups.begin(); }
- const_fixup_iterator fixup_begin() const { return Fixups.begin(); }
-
- fixup_iterator fixup_end() {return Fixups.end();}
- const_fixup_iterator fixup_end() const {return Fixups.end();}
-
- size_t fixup_size() const { return Fixups.size(); }
-
/// @name Assembler Backend Support
/// @{
//
@@ -173,6 +134,13 @@
class MCDataFragment : public MCFragment {
SmallString<32> Contents;
+ /// Fixups - The list of fixups in this fragment.
+ std::vector<MCAsmFixup> Fixups;
+
+public:
+ typedef std::vector<MCAsmFixup>::const_iterator const_fixup_iterator;
+ typedef std::vector<MCAsmFixup>::iterator fixup_iterator;
+
public:
MCDataFragment(MCSectionData *SD = 0) : MCFragment(FT_Data, SD) {}
@@ -188,6 +156,22 @@
/// @}
+ /// @name Fixup Access
+ /// @{
+
+ std::vector<MCAsmFixup> &getFixups() { return Fixups; }
+ const std::vector<MCAsmFixup> &getFixups() const { return Fixups; }
+
+ fixup_iterator fixup_begin() { return Fixups.begin(); }
+ const_fixup_iterator fixup_begin() const { return Fixups.begin(); }
+
+ fixup_iterator fixup_end() {return Fixups.end();}
+ const_fixup_iterator fixup_end() const {return Fixups.end();}
+
+ size_t fixup_size() const { return Fixups.size(); }
+
+ /// @}
+
static bool classof(const MCFragment *F) {
return F->getKind() == MCFragment::FT_Data;
}
Modified: llvm/trunk/lib/MC/MCAssembler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=96093&r1=96092&r2=96093&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCAssembler.cpp (original)
+++ llvm/trunk/lib/MC/MCAssembler.cpp Sat Feb 13 03:28:43 2010
@@ -455,7 +455,7 @@
}
}
- void ComputeRelocationInfo(MCAssembler &Asm, MCFragment &Fragment,
+ void ComputeRelocationInfo(MCAssembler &Asm, MCDataFragment &Fragment,
MCAsmFixup &Fixup,
DenseMap<const MCSymbol*,MCSymbolData*> &SymbolMap,
std::vector<MachRelocationEntry> &Relocs) {
@@ -780,9 +780,10 @@
unsigned NumRelocsStart = RelocInfos.size();
for (MCSectionData::reverse_iterator it2 = SD.rbegin(),
ie2 = SD.rend(); it2 != ie2; ++it2)
- for (unsigned i = 0, e = it2->fixup_size(); i != e; ++i)
- ComputeRelocationInfo(Asm, *it2, it2->getFixups()[e - i - 1],
- SymbolMap, RelocInfos);
+ if (MCDataFragment *DF = dyn_cast<MCDataFragment>(&*it2))
+ for (unsigned i = 0, e = DF->fixup_size(); i != e; ++i)
+ ComputeRelocationInfo(Asm, *DF, DF->getFixups()[e - i - 1],
+ SymbolMap, RelocInfos);
unsigned NumRelocs = RelocInfos.size() - NumRelocsStart;
uint64_t SectionStart = SectionDataStart + SD.getAddress();
@@ -1198,16 +1199,6 @@
OS << "<MCFragment " << (void*) this << " Offset:" << Offset
<< " FileSize:" << FileSize;
- if (!Fixups.empty()) {
- OS << "\n";
- OS << " Fixups:[";
- for (fixup_iterator it = fixup_begin(), ie = fixup_end(); it != ie; ++it) {
- if (it != fixup_begin()) OS << ",\n ";
- OS << *it;
- }
- OS << "]";
- }
-
OS << ">";
}
@@ -1233,7 +1224,19 @@
if (i) OS << ",";
OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF);
}
- OS << "]>";
+ OS << "]";
+
+ if (!getFixups().empty()) {
+ OS << ",\n ";
+ OS << " Fixups:[";
+ for (fixup_iterator it = fixup_begin(), ie = fixup_end(); it != ie; ++it) {
+ if (it != fixup_begin()) OS << ",\n ";
+ OS << *it;
+ }
+ OS << "]";
+ }
+
+ OS << ">";
}
void MCFillFragment::dump() {
More information about the llvm-commits
mailing list