Added AVRTargetObjectFile class and AVR.h

llvm-svn: 257049
This commit is contained in:
Dylan McKay 2016-01-07 10:53:15 +00:00
parent 904d5fe496
commit 5c96de3ad7
4 changed files with 130 additions and 0 deletions

54
llvm/lib/Target/AVR/AVR.h Normal file
View File

@ -0,0 +1,54 @@
//===-- AVR.h - Top-level interface for AVR representation ------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains the entry points for global functions defined in the LLVM
// AVR back-end.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_AVR_H
#define LLVM_AVR_H
#include "llvm/Target/TargetMachine.h"
#include "llvm/CodeGen/SelectionDAGNodes.h"
namespace llvm {
class AVRTargetMachine;
class FunctionPass;
FunctionPass *createAVRISelDag(AVRTargetMachine &TM,
CodeGenOpt::Level OptLevel);
FunctionPass *createAVRExpandPseudoPass();
FunctionPass *createAVRFrameAnalyzerPass();
FunctionPass *createAVRDynAllocaSRPass();
FunctionPass *createAVRBranchSelectionPass();
/**
* Contains the AVR backend.
*/
namespace AVR {
enum AddressSpace { DataMemory, ProgramMemory };
template <typename T> bool isProgramMemoryAddress(T *V) {
return cast<PointerType>(V->getType())->getAddressSpace() == ProgramMemory;
}
inline bool isProgramMemoryAccess(MemSDNode const *N) {
auto V = N->getMemOperand()->getValue();
return (V != nullptr) ? isProgramMemoryAddress(V) : false;
}
} // end of namespace AVR
} // end namespace llvm
#endif // LLVM_AVR_H

View File

@ -0,0 +1,40 @@
//===-- AVRTargetObjectFile.cpp - AVR Object Files ------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "AVRTargetObjectFile.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 "llvm/Support/ELF.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 GlobalValue *GV,
SectionKind Kind, Mangler &Mang,
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(GV) && !GV->hasSection())
return ProgmemDataSection;
// Otherwise, we work the same way as ELF.
return Base::SelectSectionForGlobal(GV, Kind, Mang, TM);
}
} // end of namespace llvm

View File

@ -0,0 +1,35 @@
//===-- AVRTargetObjectFile.h - AVR Object Info -----------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_AVR_TARGET_OBJECT_FILE_H
#define LLVM_AVR_TARGET_OBJECT_FILE_H
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
namespace llvm {
/**
* Lowering for an AVR ELF32 object file.
*/
class AVRTargetObjectFile : public TargetLoweringObjectFileELF {
typedef TargetLoweringObjectFileELF Base;
public:
void Initialize(MCContext &ctx, const TargetMachine &TM) override;
MCSection *SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
Mangler &Mang,
const TargetMachine &TM) const override;
private:
MCSection *ProgmemDataSection;
};
} // end namespace llvm
#endif // LLVM_AVR_TARGET_OBJECT_FILE_H

View File

@ -6,6 +6,7 @@ add_public_tablegen_target(AVRCommonTableGen)
add_llvm_target(AVRCodeGen
AVRTargetMachine.cpp
AVRTargetObjectFile.cpp
)
add_dependencies(LLVMAVRCodeGen intrinsics_gen)