| //===-- AVRTargetObjectFile.cpp - AVR Object Files ------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "AVRTargetObjectFile.h" |
| |
| #include "llvm/BinaryFormat/ELF.h" |
| #include "llvm/IR/DerivedTypes.h" |
| #include "llvm/IR/GlobalValue.h" |
| #include "llvm/IR/Mangler.h" |
| #include "llvm/MC/MCContext.h" |
| #include "llvm/MC/MCSectionELF.h" |
| |
| #include "AVR.h" |
| |
| namespace llvm { |
| void AVRTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) { |
| Base::Initialize(Ctx, TM); |
| ProgmemDataSection = |
| Ctx.getELFSection(".progmem.data", ELF::SHT_PROGBITS, ELF::SHF_ALLOC); |
| } |
| |
| MCSection *AVRTargetObjectFile::SelectSectionForGlobal( |
| const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const { |
| // Global values in flash memory are placed in the progmem.data section |
| // unless they already have a user assigned section. |
| if (AVR::isProgramMemoryAddress(GO) && !GO->hasSection() && Kind.isReadOnly()) |
| return ProgmemDataSection; |
| |
| // Otherwise, we work the same way as ELF. |
| return Base::SelectSectionForGlobal(GO, Kind, TM); |
| } |
| } // end of namespace llvm |