mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-05 19:29:54 +00:00
Added AVRTargetObjectFile class and AVR.h
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257049 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e04de627a1
commit
db2b2ca62a
54
lib/Target/AVR/AVR.h
Normal file
54
lib/Target/AVR/AVR.h
Normal 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
|
40
lib/Target/AVR/AVRTargetObjectFile.cpp
Normal file
40
lib/Target/AVR/AVRTargetObjectFile.cpp
Normal 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
|
35
lib/Target/AVR/AVRTargetObjectFile.h
Normal file
35
lib/Target/AVR/AVRTargetObjectFile.h
Normal 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
|
@ -6,6 +6,7 @@ add_public_tablegen_target(AVRCommonTableGen)
|
||||
|
||||
add_llvm_target(AVRCodeGen
|
||||
AVRTargetMachine.cpp
|
||||
AVRTargetObjectFile.cpp
|
||||
)
|
||||
|
||||
add_dependencies(LLVMAVRCodeGen intrinsics_gen)
|
||||
|
Loading…
Reference in New Issue
Block a user