summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-03-23 03:13:05 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-03-23 03:13:05 +0000
commit86face833302fd71575a79d08bee8170e7cd2490 (patch)
tree4954f56f5b6738b6a02bb198c56c0adefa434f75 /llvm/lib/MC
parenta9ae3ae698a5ed01a019994880c14c4b9c4415d2 (diff)
downloadbcm5719-llvm-86face833302fd71575a79d08bee8170e7cd2490.tar.gz
bcm5719-llvm-86face833302fd71575a79d08bee8170e7cd2490.zip
MC: Add TargetAsmBackend::MayNeedRelaxation, for checking whether a particular instruction + fixups might need relaxation.
llvm-svn: 99249
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r--llvm/lib/MC/MCAssembler.cpp2
-rw-r--r--llvm/lib/MC/MCMachOStreamer.cpp15
2 files changed, 12 insertions, 5 deletions
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp
index 7672528524b..031820d5286 100644
--- a/llvm/lib/MC/MCAssembler.cpp
+++ b/llvm/lib/MC/MCAssembler.cpp
@@ -715,7 +715,7 @@ void MCAssembler::FinishLayout(MCAsmLayout &Layout) {
// Create a new data fragment for the instruction.
//
- // FIXME: Reuse previous data fragment if possible.
+ // FIXME-PERF: Reuse previous data fragment if possible.
MCDataFragment *DF = new MCDataFragment();
SD.getFragmentList().insert(it2, DF);
diff --git a/llvm/lib/MC/MCMachOStreamer.cpp b/llvm/lib/MC/MCMachOStreamer.cpp
index a52d962c9a4..2a1aa273014 100644
--- a/llvm/lib/MC/MCMachOStreamer.cpp
+++ b/llvm/lib/MC/MCMachOStreamer.cpp
@@ -383,12 +383,19 @@ void MCMachOStreamer::EmitInstruction(const MCInst &Inst) {
Assembler.getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
VecOS.flush();
- // Add the fixups and data.
- MCDataFragment *DF = getOrCreateDataFragment();
+ // FIXME: Eliminate this copy.
+ SmallVector<MCAsmFixup, 4> AsmFixups;
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()));
+ AsmFixups.push_back(MCAsmFixup(F.getOffset(), *F.getValue(),
+ F.getKind()));
+ }
+
+ // Add the fixups and data.
+ MCDataFragment *DF = getOrCreateDataFragment();
+ for (unsigned i = 0, e = AsmFixups.size(); i != e; ++i) {
+ AsmFixups[i].Offset += DF->getContents().size();
+ DF->addFixup(AsmFixups[i]);
}
DF->getContents().append(Code.begin(), Code.end());
}
OpenPOWER on IntegriCloud