[llvm-commits] [llvm] r99244 - in /llvm/trunk: include/llvm/MC/MCAssembler.h lib/MC/MCAssembler.cpp
Daniel Dunbar
daniel at zuster.org
Mon Mar 22 18:39:05 PDT 2010
Author: ddunbar
Date: Mon Mar 22 20:39:05 2010
New Revision: 99244
URL: http://llvm.org/viewvc/llvm-project?rev=99244&view=rev
Log:
MC: Tweak MCInstFragment to include the encoded data and fixups, so that we don't need to recompute them during relaxation. I will revisit this once all the other pieces of fast relaxation are in place.
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=99244&r1=99243&r2=99244&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCAssembler.h (original)
+++ llvm/trunk/include/llvm/MC/MCAssembler.h Mon Mar 22 20:39:05 2010
@@ -180,28 +180,57 @@
virtual void dump();
};
+// FIXME: This current incarnation of MCInstFragment doesn't make much sense, as
+// it is almost entirely a duplicate of MCDataFragment. If we decide to stick
+// with this approach (as opposed to making MCInstFragment a very light weight
+// object with just the MCInst and a code size, then we should just change
+// MCDataFragment to have an optional MCInst at its end.
class MCInstFragment : public MCFragment {
/// Inst - The instruction this is a fragment for.
MCInst Inst;
/// InstSize - The size of the currently encoded instruction.
- unsigned InstSize;
+ SmallString<8> Code;
+
+ /// Fixups - The list of fixups in this fragment.
+ SmallVector<MCAsmFixup, 1> Fixups;
+
+public:
+ typedef SmallVectorImpl<MCAsmFixup>::const_iterator const_fixup_iterator;
+ typedef SmallVectorImpl<MCAsmFixup>::iterator fixup_iterator;
public:
- MCInstFragment(MCInst _Inst, unsigned _InstSize, MCSectionData *SD = 0)
- : MCFragment(FT_Inst, SD), Inst(_Inst), InstSize(_InstSize) {}
+ MCInstFragment(MCInst _Inst, MCSectionData *SD = 0)
+ : MCFragment(FT_Inst, SD), Inst(_Inst) {
+ }
/// @name Accessors
/// @{
- unsigned getInstSize() const { return InstSize; }
+ SmallVectorImpl<char> &getCode() { return Code; }
+ const SmallVectorImpl<char> &getCode() const { return Code; }
+ unsigned getInstSize() const { return Code.size(); }
+
+ MCInst &getInst() { return Inst; }
const MCInst &getInst() const { return Inst; }
- void setInst(MCInst Inst, unsigned InstSize) {
- this->Inst = Inst;
- this->InstSize = InstSize;
- }
+ void setInst(MCInst Value) { Inst = Value; }
+
+ /// @}
+ /// @name Fixup Access
+ /// @{
+
+ SmallVectorImpl<MCAsmFixup> &getFixups() { return Fixups; }
+ const SmallVectorImpl<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(); }
/// @}
Modified: llvm/trunk/lib/MC/MCAssembler.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=99244&r1=99243&r2=99244&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCAssembler.cpp (original)
+++ llvm/trunk/lib/MC/MCAssembler.cpp Mon Mar 22 20:39:05 2010
@@ -773,22 +773,14 @@
SD.getFragmentList().insert(it2, DF);
// Update the data fragments layout data.
+ DF->setParent(IF->getParent());
DF->setOffset(IF->getOffset());
DF->setFileSize(IF->getInstSize());
- // Encode the final instruction.
- SmallVector<MCFixup, 4> Fixups;
- raw_svector_ostream VecOS(DF->getContents());
- getEmitter().EncodeInstruction(IF->getInst(), VecOS, Fixups);
-
- // Copy over the fixups.
- //
- // FIXME-PERF: Encode fixups directly into the data fragment as well.
- for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
- MCFixup &F = Fixups[i];
- DF->addFixup(MCAsmFixup(DF->getContents().size()+F.getOffset(),
- *F.getValue(), F.getKind()));
- }
+ // Copy in the data and the fixups.
+ DF->getContents().append(IF->getCode().begin(), IF->getCode().end());
+ for (unsigned i = 0, e = IF->getFixups().size(); i != e; ++i)
+ DF->getFixups().push_back(IF->getFixups()[i]);
// Delete the instruction fragment and update the iterator.
SD.getFragmentList().erase(IF);
More information about the llvm-commits
mailing list