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 | 337055e62f28f18a9a8c4a090633cae1c2256ae1 (patch) | |
tree | 18a00928afa5902aa07967f5e3f2492e6f59b97c /lib/MC/MCMachOStreamer.cpp | |
parent | 8f9b80e5df12779a56d763ebf20864dad2bc72da (diff) |
MC: Add TargetAsmBackend::MayNeedRelaxation, for checking whether a particular instruction + fixups might need relaxation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99249 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCMachOStreamer.cpp')
-rw-r--r-- | lib/MC/MCMachOStreamer.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp index a52d962c9a..2a1aa27301 100644 --- a/lib/MC/MCMachOStreamer.cpp +++ b/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()); } |