Index: llvm/trunk/include/llvm/MC/ConstantPools.h =================================================================== --- llvm/trunk/include/llvm/MC/ConstantPools.h +++ llvm/trunk/include/llvm/MC/ConstantPools.h @@ -63,6 +63,8 @@ // Return true if the constant pool is empty bool empty(); + + void clearCache(); }; class AssemblerConstantPools { @@ -86,6 +88,7 @@ public: void emitAll(MCStreamer &Streamer); void emitForCurrentSection(MCStreamer &Streamer); + void clearCacheForCurrentSection(MCStreamer &Streamer); const MCExpr *addEntry(MCStreamer &Streamer, const MCExpr *Expr, unsigned Size, SMLoc Loc); Index: llvm/trunk/lib/MC/ConstantPools.cpp =================================================================== --- llvm/trunk/lib/MC/ConstantPools.cpp +++ llvm/trunk/lib/MC/ConstantPools.cpp @@ -57,6 +57,10 @@ bool ConstantPool::empty() { return Entries.empty(); } +void ConstantPool::clearCache() { + CachedEntries.clear(); +} + // // AssemblerConstantPools implementation // @@ -98,6 +102,13 @@ } } +void AssemblerConstantPools::clearCacheForCurrentSection(MCStreamer &Streamer) { + MCSection *Section = Streamer.getCurrentSectionOnly(); + if (ConstantPool *CP = getConstantPool(Section)) { + CP->clearCache(); + } +} + const MCExpr *AssemblerConstantPools::addEntry(MCStreamer &Streamer, const MCExpr *Expr, unsigned Size, SMLoc Loc) { Index: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMTargetStreamer.cpp @@ -38,6 +38,7 @@ void ARMTargetStreamer::emitCurrentConstantPool() { ConstantPools->emitForCurrentSection(Streamer); + ConstantPools->clearCacheForCurrentSection(Streamer); } // finish() - write out any non-empty assembler constant pools. Index: llvm/trunk/test/MC/ARM/ltorg-range.s =================================================================== --- llvm/trunk/test/MC/ARM/ltorg-range.s +++ llvm/trunk/test/MC/ARM/ltorg-range.s @@ -0,0 +1,27 @@ +@ RUN: llvm-mc -triple armv7-unknown-linux-gnueabi -filetype obj -o - %s \ +@ RUN: | llvm-objdump -d - | FileCheck %s + + ldr r0, =0x01020304 +@ CHECK: ldr + .ltorg +@ CHECK: 0x01020304 + ldr r0, =0x01020304 + ldr r0, =0x01020304 + ldr r0, =0x01020304 +@ CHECK: ldr +@ CHECK: ldr +@ CHECK: ldr + .ltorg +@ CHECK: 0x01020304 + .rep 1028 + .word 0 + .endr +@ CHECK: 0x00000000 + + ldr r0, =0x01020304 +@ CHECK: ldr + .ltorg +@ CHECK: 0x01020304 + .rep 1028 + .word 0 + .endr