diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2010-03-23 03:13:05 +0000 |
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2010-03-23 03:13:05 +0000 |
| commit | 86face833302fd71575a79d08bee8170e7cd2490 (patch) | |
| tree | 4954f56f5b6738b6a02bb198c56c0adefa434f75 /llvm/lib/MC | |
| parent | a9ae3ae698a5ed01a019994880c14c4b9c4415d2 (diff) | |
| download | bcm5719-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.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/MC/MCMachOStreamer.cpp | 15 |
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()); } |

