Add TargetAsmInfo stuff for all darwin-based targets

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53787 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anton Korobeynikov 2008-07-19 13:14:46 +00:00
parent debe34bd8d
commit 745e864eab
2 changed files with 172 additions and 0 deletions

View File

@ -0,0 +1,43 @@
//===---- DarwinTargetAsmInfo.h - Darwin asm properties ---------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines target asm properties related what form asm statements
// should take in general on Darwin-based targets
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_ELF_TARGET_ASM_INFO_H
#define LLVM_ELF_TARGET_ASM_INFO_H
#include "llvm/Target/TargetAsmInfo.h"
#include "llvm/Target/TargetMachine.h"
namespace llvm {
class GlobalValue;
class GlobalVariable;
class DarwinTargetAsmInfo: public TargetAsmInfo {
const Section* TextCoalSection;
const Section* ConstDataCoalSection;
const Section* ConstDataSection;
const Section* DataCoalSection;
explicit DarwinTargetAsmInfo(const TargetMachine &TM);
virtual const Section* SelectSectionForGlobal(const GlobalValue *GV) const;
virtual std::string UniqueSectionForGlobal(const GlobalValue* GV,
SectionKind::Kind kind) const;
const Section* MergeableConstSection(const GlobalVariable *GV) const;
const Section* MergeableStringSection(const GlobalVariable *GV) const;
protected:
const TargetMachine* ETM;
};
}
#endif // LLVM_ELF_TARGET_ASM_INFO_H

View File

@ -0,0 +1,129 @@
//===-- DarwinTargetAsmInfo.cpp - Darwin asm properties ---------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines target asm properties related what form asm statements
// should take in general on Darwin-based targets
//
//===----------------------------------------------------------------------===//
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
#include "llvm/Function.h"
#include "llvm/GlobalVariable.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Target/DarwinTargetAsmInfo.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetData.h"
using namespace llvm;
DarwinTargetAsmInfo::DarwinTargetAsmInfo(const TargetMachine &TM) {
ETM = &TM;
CStringSection_ = getUnnamedSection("\t.cstring",
SectionFlags::Mergeable | SectionFlags::Strings);
FourByteConstantSection_ = getUnnamedSection("\t.literal4\n",
SectionFlags::Mergeable);
EightByteConstantSection_ = getUnnamedSection("\t.literal8\n",
SectionFlags::Mergeable);
// FIXME: Check for 64 bit
SixteenByteConstantSection_ = getUnnamedSection("\t.literal16\n",
SectionFlags::Mergeable);
ReadOnlySection_ = getUnnamedSection("\t.const\n", SectionFlags::None);
// FIXME: These should be named sections, really.
TextCoalSection =
getUnnamedSection(".section __TEXT,__textcoal_nt,coalesced,pure_instructions",
SectionFlags::Code);
ConstDataCoalSection =
getUnnamedSection(".section __DATA,__const_coal,coalesced",
SectionFlags::None);
ConstDataSection = getUnnamedSection(".const_data", SectionFlags::None);
DataCoalSection = getUnnamedSection(".section __DATA,__datacoal_nt,coalesced",
SectionFlags::Writeable);
}
const Section*
DarwinTargetAsmInfo::SelectSectionForGlobal(const GlobalValue *GV) const {
SectionKind::Kind Kind = SectionKindForGlobal(GV);
bool isWeak = GV->isWeakForLinker();
bool isNonStatic = (ETM->getRelocationModel() != Reloc::Static);
switch (Kind) {
case SectionKind::Text:
if (isWeak)
return TextCoalSection;
else
return getTextSection_();
case SectionKind::Data:
case SectionKind::ThreadData:
case SectionKind::BSS:
case SectionKind::ThreadBSS:
if (cast<GlobalVariable>(GV)->isConstant())
return (isWeak ? ConstDataCoalSection : ConstDataSection);
else
return (isWeak ? DataCoalSection : getDataSection_());
case SectionKind::ROData:
return (isWeak ? ConstDataCoalSection :
(isNonStatic ? ConstDataSection : getReadOnlySection_()));
case SectionKind::RODataMergeStr:
return (isWeak ?
ConstDataCoalSection :
MergeableStringSection(cast<GlobalVariable>(GV)));
case SectionKind::RODataMergeConst:
return (isWeak ?
ConstDataCoalSection:
MergeableConstSection(cast<GlobalVariable>(GV)));
default:
assert(0 && "Unsuported section kind for global");
}
// FIXME: Do we have any extra special weird cases?
}
const Section*
DarwinTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const {
const TargetData *TD = ETM->getTargetData();
Constant *C = cast<GlobalVariable>(GV)->getInitializer();
const Type *Type = cast<ConstantArray>(C)->getType()->getElementType();
unsigned Size = TD->getABITypeSize(Type);
if (Size) {
const TargetData *TD = ETM->getTargetData();
unsigned Align = TD->getPreferredAlignment(GV);
if (Align <= 32)
return getCStringSection_();
}
return getReadOnlySection_();
}
const Section*
DarwinTargetAsmInfo::MergeableConstSection(const GlobalVariable *GV) const {
const TargetData *TD = ETM->getTargetData();
Constant *C = cast<GlobalVariable>(GV)->getInitializer();
unsigned Size = TD->getABITypeSize(C->getType());
if (Size == 4)
return FourByteConstantSection_;
else if (Size == 8)
return EightByteConstantSection_;
// FIXME: 64 bit
/*else if (Size == 16 && ETM->getSubtarget<X86Subtarget>().is64Bit())
return SixteenByteConstantSection_;*/
return getReadOnlySection_();
}
std::string
DarwinTargetAsmInfo::UniqueSectionForGlobal(const GlobalValue* GV,
SectionKind::Kind kind) const {
assert(0 && "Darwin does not use unique sections");
return "";
}