diff options
| -rw-r--r-- | llvm/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.cpp | 20 | ||||
| -rw-r--r-- | llvm/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.h | 2 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AVR/clear-bss.ll | 5 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AVR/copy-data-to-ram.ll | 5 |
4 files changed, 32 insertions, 0 deletions
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.cpp index a2d8c16eeb8..2b45d9adc7e 100644 --- a/llvm/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.cpp +++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.cpp @@ -13,6 +13,8 @@ #include "AVRTargetStreamer.h" +#include "llvm/MC/MCContext.h" + namespace llvm { AVRTargetStreamer::AVRTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} @@ -20,5 +22,23 @@ AVRTargetStreamer::AVRTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} AVRTargetAsmStreamer::AVRTargetAsmStreamer(MCStreamer &S) : AVRTargetStreamer(S) {} +void AVRTargetStreamer::finish() { + MCStreamer &OS = getStreamer(); + MCContext &Context = OS.getContext(); + + MCSymbol *DoCopyData = Context.getOrCreateSymbol("__do_copy_data"); + MCSymbol *DoClearBss = Context.getOrCreateSymbol("__do_clear_bss"); + + // FIXME: We can disable __do_copy_data if there are no static RAM variables. + + OS.emitRawComment(" Declaring this symbol tells the CRT that it should"); + OS.emitRawComment("copy all variables from program memory to RAM on startup"); + OS.EmitSymbolAttribute(DoCopyData, MCSA_Global); + + OS.emitRawComment(" Declaring this symbol tells the CRT that it should"); + OS.emitRawComment("clear the zeroed data section on startup"); + OS.EmitSymbolAttribute(DoClearBss, MCSA_Global); +} + } // end namespace llvm diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.h b/llvm/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.h index 99a536699ae..815088b0a5d 100644 --- a/llvm/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.h +++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.h @@ -19,6 +19,8 @@ class MCStreamer; class AVRTargetStreamer : public MCTargetStreamer { public: explicit AVRTargetStreamer(MCStreamer &S); + + void finish() override; }; /// A target streamer for textual AVR assembly code. diff --git a/llvm/test/CodeGen/AVR/clear-bss.ll b/llvm/test/CodeGen/AVR/clear-bss.ll new file mode 100644 index 00000000000..9c63815c098 --- /dev/null +++ b/llvm/test/CodeGen/AVR/clear-bss.ll @@ -0,0 +1,5 @@ +; RUN: llc < %s -march=avr | FileCheck %s + +; CHECK: .globl __do_clear_bss +@zeroed = internal constant [3 x i8] zeroinitializer + diff --git a/llvm/test/CodeGen/AVR/copy-data-to-ram.ll b/llvm/test/CodeGen/AVR/copy-data-to-ram.ll new file mode 100644 index 00000000000..021cc0f1a7f --- /dev/null +++ b/llvm/test/CodeGen/AVR/copy-data-to-ram.ll @@ -0,0 +1,5 @@ +; RUN: llc < %s -march=avr | FileCheck %s + +; CHECK: .globl __do_copy_data +@str = internal global [3 x i8] c"foo" + |

