1*0b57cec5SDimitry Andric //===-- AVRTargetObjectFile.cpp - AVR Object Files ------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric
9*0b57cec5SDimitry Andric #include "AVRTargetObjectFile.h"
10*0b57cec5SDimitry Andric
11*0b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELF.h"
12*0b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h"
13*0b57cec5SDimitry Andric #include "llvm/IR/GlobalValue.h"
14*0b57cec5SDimitry Andric #include "llvm/IR/Mangler.h"
15*0b57cec5SDimitry Andric #include "llvm/MC/MCContext.h"
16*0b57cec5SDimitry Andric #include "llvm/MC/MCSectionELF.h"
17*0b57cec5SDimitry Andric
18*0b57cec5SDimitry Andric #include "AVR.h"
19*0b57cec5SDimitry Andric
20*0b57cec5SDimitry Andric namespace llvm {
Initialize(MCContext & Ctx,const TargetMachine & TM)21*0b57cec5SDimitry Andric void AVRTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) {
22*0b57cec5SDimitry Andric Base::Initialize(Ctx, TM);
23*0b57cec5SDimitry Andric ProgmemDataSection =
24*0b57cec5SDimitry Andric Ctx.getELFSection(".progmem.data", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
25*0b57cec5SDimitry Andric }
26*0b57cec5SDimitry Andric
27*0b57cec5SDimitry Andric MCSection *
SelectSectionForGlobal(const GlobalObject * GO,SectionKind Kind,const TargetMachine & TM) const28*0b57cec5SDimitry Andric AVRTargetObjectFile::SelectSectionForGlobal(const GlobalObject *GO,
29*0b57cec5SDimitry Andric SectionKind Kind,
30*0b57cec5SDimitry Andric const TargetMachine &TM) const {
31*0b57cec5SDimitry Andric // Global values in flash memory are placed in the progmem.data section
32*0b57cec5SDimitry Andric // unless they already have a user assigned section.
33*0b57cec5SDimitry Andric if (AVR::isProgramMemoryAddress(GO) && !GO->hasSection() && Kind.isReadOnly())
34*0b57cec5SDimitry Andric return ProgmemDataSection;
35*0b57cec5SDimitry Andric
36*0b57cec5SDimitry Andric // Otherwise, we work the same way as ELF.
37*0b57cec5SDimitry Andric return Base::SelectSectionForGlobal(GO, Kind, TM);
38*0b57cec5SDimitry Andric }
39*0b57cec5SDimitry Andric } // end of namespace llvm
40*0b57cec5SDimitry Andric
41