mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
Use TARGET2 relocation for TType references on ARM.
Do some cleanup of the code while here. Inspired by patch by Logan Chien! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167904 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
78e786b58f
commit
25efd6d556
@ -385,10 +385,8 @@ namespace llvm {
|
||||
/// GetSizeOfEncodedValue - Return the size of the encoding in bytes.
|
||||
unsigned GetSizeOfEncodedValue(unsigned Encoding) const;
|
||||
|
||||
/// EmitReference - Emit a reference to a label with a specified encoding.
|
||||
///
|
||||
void EmitReference(const MCSymbol *Sym, unsigned Encoding) const;
|
||||
void EmitReference(const GlobalValue *GV, unsigned Encoding) const;
|
||||
/// EmitReference - Emit reference to a ttype global with a specified encoding.
|
||||
void EmitTTypeReference(const GlobalValue *GV, unsigned Encoding) const;
|
||||
|
||||
/// EmitSectionOffset - Emit the 4-byte offset of Label from the start of
|
||||
/// its section. This can be done with a special directive if the target
|
||||
|
@ -57,11 +57,10 @@ public:
|
||||
|
||||
/// getExprForDwarfGlobalReference - Return an MCExpr to use for a reference
|
||||
/// to the specified global variable from exception handling information.
|
||||
///
|
||||
virtual const MCExpr *
|
||||
getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const;
|
||||
getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const;
|
||||
|
||||
// getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality.
|
||||
virtual MCSymbol *
|
||||
@ -103,12 +102,12 @@ public:
|
||||
virtual bool shouldEmitUsedDirectiveFor(const GlobalValue *GV,
|
||||
Mangler *) const;
|
||||
|
||||
/// getExprForDwarfGlobalReference - The mach-o version of this method
|
||||
/// getTTypeGlobalReference - The mach-o version of this method
|
||||
/// defaults to returning a stub reference.
|
||||
virtual const MCExpr *
|
||||
getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const;
|
||||
getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const;
|
||||
|
||||
// getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality.
|
||||
virtual MCSymbol *
|
||||
|
@ -27,6 +27,7 @@ namespace llvm {
|
||||
class MCExpr;
|
||||
class MCSection;
|
||||
class MCSymbol;
|
||||
class MCSymbolRefExpr;
|
||||
class MCStreamer;
|
||||
class GlobalValue;
|
||||
class TargetMachine;
|
||||
@ -108,13 +109,13 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// getExprForDwarfGlobalReference - Return an MCExpr to use for a reference
|
||||
/// getTTypeGlobalReference - Return an MCExpr to use for a reference
|
||||
/// to the specified global variable from exception handling information.
|
||||
///
|
||||
virtual const MCExpr *
|
||||
getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const;
|
||||
getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const;
|
||||
|
||||
// getCFIPersonalitySymbol - The symbol that gets passed to .cfi_personality.
|
||||
virtual MCSymbol *
|
||||
@ -123,8 +124,8 @@ public:
|
||||
|
||||
///
|
||||
const MCExpr *
|
||||
getExprForDwarfReference(const MCSymbol *Sym, unsigned Encoding,
|
||||
MCStreamer &Streamer) const;
|
||||
getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding,
|
||||
MCStreamer &Streamer) const;
|
||||
|
||||
virtual const MCSection *
|
||||
getStaticCtorSection(unsigned Priority = 65535) const {
|
||||
|
@ -119,19 +119,11 @@ unsigned AsmPrinter::GetSizeOfEncodedValue(unsigned Encoding) const {
|
||||
}
|
||||
}
|
||||
|
||||
void AsmPrinter::EmitReference(const MCSymbol *Sym, unsigned Encoding) const {
|
||||
void AsmPrinter::EmitTTypeReference(const GlobalValue *GV, unsigned Encoding)const{
|
||||
const TargetLoweringObjectFile &TLOF = getObjFileLowering();
|
||||
|
||||
const MCExpr *Exp =
|
||||
TLOF.getExprForDwarfReference(Sym, Encoding, OutStreamer);
|
||||
OutStreamer.EmitAbsValue(Exp, GetSizeOfEncodedValue(Encoding));
|
||||
}
|
||||
|
||||
void AsmPrinter::EmitReference(const GlobalValue *GV, unsigned Encoding)const{
|
||||
const TargetLoweringObjectFile &TLOF = getObjFileLowering();
|
||||
|
||||
const MCExpr *Exp =
|
||||
TLOF.getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, OutStreamer);
|
||||
TLOF.getTTypeGlobalReference(GV, Mang, MMI, Encoding, OutStreamer);
|
||||
OutStreamer.EmitValue(Exp, GetSizeOfEncodedValue(Encoding), /*addrspace*/0);
|
||||
}
|
||||
|
||||
|
@ -685,7 +685,7 @@ void DwarfException::EmitExceptionTable() {
|
||||
if (VerboseAsm)
|
||||
Asm->OutStreamer.AddComment("TypeInfo " + Twine(Entry--));
|
||||
if (GV)
|
||||
Asm->EmitReference(GV, TTypeEncoding);
|
||||
Asm->EmitTTypeReference(GV, TTypeEncoding);
|
||||
else
|
||||
Asm->OutStreamer.EmitIntValue(0,Asm->GetSizeOfEncodedValue(TTypeEncoding),
|
||||
0);
|
||||
|
@ -88,6 +88,36 @@ void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
|
||||
Streamer.EmitSymbolValue(Sym, Size);
|
||||
}
|
||||
|
||||
const MCExpr *TargetLoweringObjectFileELF::
|
||||
getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const {
|
||||
|
||||
if (Encoding & dwarf::DW_EH_PE_indirect) {
|
||||
MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
|
||||
|
||||
SmallString<128> Name;
|
||||
Mang->getNameWithPrefix(Name, GV, true);
|
||||
Name += ".DW.stub";
|
||||
|
||||
// Add information about the stub reference to ELFMMI so that the stub
|
||||
// gets emitted by the asmprinter.
|
||||
MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
|
||||
MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
|
||||
if (StubSym.getPointer() == 0) {
|
||||
MCSymbol *Sym = Mang->getSymbol(GV);
|
||||
StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
|
||||
}
|
||||
|
||||
return TargetLoweringObjectFile::
|
||||
getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()),
|
||||
Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
|
||||
}
|
||||
|
||||
return TargetLoweringObjectFile::
|
||||
getTTypeGlobalReference(GV, Mang, MMI, Encoding, Streamer);
|
||||
}
|
||||
|
||||
static SectionKind
|
||||
getELFKindForNamedSection(StringRef Name, SectionKind K) {
|
||||
// N.B.: The defaults used in here are no the same ones used in MC.
|
||||
@ -314,35 +344,6 @@ getSectionForConstant(SectionKind Kind) const {
|
||||
return DataRelROSection;
|
||||
}
|
||||
|
||||
const MCExpr *TargetLoweringObjectFileELF::
|
||||
getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI,
|
||||
unsigned Encoding, MCStreamer &Streamer) const {
|
||||
|
||||
if (Encoding & dwarf::DW_EH_PE_indirect) {
|
||||
MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
|
||||
|
||||
SmallString<128> Name;
|
||||
Mang->getNameWithPrefix(Name, GV, true);
|
||||
Name += ".DW.stub";
|
||||
|
||||
// Add information about the stub reference to ELFMMI so that the stub
|
||||
// gets emitted by the asmprinter.
|
||||
MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
|
||||
MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
|
||||
if (StubSym.getPointer() == 0) {
|
||||
MCSymbol *Sym = Mang->getSymbol(GV);
|
||||
StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
|
||||
}
|
||||
|
||||
return TargetLoweringObjectFile::
|
||||
getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
|
||||
}
|
||||
|
||||
return TargetLoweringObjectFile::
|
||||
getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
|
||||
}
|
||||
|
||||
const MCSection *
|
||||
TargetLoweringObjectFileELF::getStaticCtorSection(unsigned Priority) const {
|
||||
// The default scheme is .ctor / .dtor, so we have to invert the priority
|
||||
@ -604,9 +605,9 @@ shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
|
||||
}
|
||||
|
||||
const MCExpr *TargetLoweringObjectFileMachO::
|
||||
getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const {
|
||||
getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const {
|
||||
// The mach-o version of this method defaults to returning a stub reference.
|
||||
|
||||
if (Encoding & DW_EH_PE_indirect) {
|
||||
@ -629,11 +630,12 @@ getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
}
|
||||
|
||||
return TargetLoweringObjectFile::
|
||||
getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
|
||||
getTTypeReference(MCSymbolRefExpr::Create(SSym, getContext()),
|
||||
Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
|
||||
}
|
||||
|
||||
return TargetLoweringObjectFile::
|
||||
getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
|
||||
getTTypeGlobalReference(GV, Mang, MMI, Encoding, Streamer);
|
||||
}
|
||||
|
||||
MCSymbol *TargetLoweringObjectFileMachO::
|
||||
|
@ -10,10 +10,12 @@
|
||||
#include "ARMTargetObjectFile.h"
|
||||
#include "ARMSubtarget.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCSectionELF.h"
|
||||
#include "llvm/Target/Mangler.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/Support/Dwarf.h"
|
||||
#include "llvm/Support/ELF.h"
|
||||
#include "llvm/Target/TargetMachine.h"
|
||||
#include "llvm/ADT/StringExtras.h"
|
||||
using namespace llvm;
|
||||
using namespace dwarf;
|
||||
@ -38,3 +40,14 @@ void ARMElfTargetObjectFile::Initialize(MCContext &Ctx,
|
||||
0,
|
||||
SectionKind::getMetadata());
|
||||
}
|
||||
|
||||
const MCExpr *ARMElfTargetObjectFile::
|
||||
getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const {
|
||||
assert(Encoding == DW_EH_PE_absptr && "Can handle absptr encoding only");
|
||||
|
||||
return MCSymbolRefExpr::Create(Mang->getSymbol(GV),
|
||||
MCSymbolRefExpr::VK_ARM_TARGET2,
|
||||
getContext());
|
||||
}
|
||||
|
@ -28,6 +28,11 @@ public:
|
||||
|
||||
virtual void Initialize(MCContext &Ctx, const TargetMachine &TM);
|
||||
|
||||
const MCExpr *
|
||||
getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const;
|
||||
|
||||
virtual const MCSection *getAttributesSection() const {
|
||||
return AttributesSection;
|
||||
}
|
||||
|
@ -285,35 +285,35 @@ TargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {
|
||||
return DataSection;
|
||||
}
|
||||
|
||||
/// getExprForDwarfGlobalReference - Return an MCExpr to use for a
|
||||
/// getTTypeGlobalReference - Return an MCExpr to use for a
|
||||
/// reference to the specified global variable from exception
|
||||
/// handling information.
|
||||
const MCExpr *TargetLoweringObjectFile::
|
||||
getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const {
|
||||
const MCSymbol *Sym = Mang->getSymbol(GV);
|
||||
return getExprForDwarfReference(Sym, Encoding, Streamer);
|
||||
getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const {
|
||||
const MCSymbolRefExpr *Ref =
|
||||
MCSymbolRefExpr::Create(Mang->getSymbol(GV), getContext());
|
||||
|
||||
return getTTypeReference(Ref, Encoding, Streamer);
|
||||
}
|
||||
|
||||
const MCExpr *TargetLoweringObjectFile::
|
||||
getExprForDwarfReference(const MCSymbol *Sym, unsigned Encoding,
|
||||
MCStreamer &Streamer) const {
|
||||
const MCExpr *Res = MCSymbolRefExpr::Create(Sym, getContext());
|
||||
|
||||
getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding,
|
||||
MCStreamer &Streamer) const {
|
||||
switch (Encoding & 0x70) {
|
||||
default:
|
||||
report_fatal_error("We do not support this DWARF encoding yet!");
|
||||
case dwarf::DW_EH_PE_absptr:
|
||||
// Do nothing special
|
||||
return Res;
|
||||
return Sym;
|
||||
case dwarf::DW_EH_PE_pcrel: {
|
||||
// Emit a label to the streamer for the current position. This gives us
|
||||
// .-foo addressing.
|
||||
MCSymbol *PCSym = getContext().CreateTempSymbol();
|
||||
Streamer.EmitLabel(PCSym);
|
||||
const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, getContext());
|
||||
return MCBinaryExpr::CreateSub(Res, PC, getContext());
|
||||
return MCBinaryExpr::CreateSub(Sym, PC, getContext());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -22,9 +22,9 @@ using namespace llvm;
|
||||
using namespace dwarf;
|
||||
|
||||
const MCExpr *X86_64MachoTargetObjectFile::
|
||||
getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const {
|
||||
getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const {
|
||||
|
||||
// On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which
|
||||
// is an indirect pc-relative reference.
|
||||
@ -37,7 +37,7 @@ getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
}
|
||||
|
||||
return TargetLoweringObjectFileMachO::
|
||||
getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
|
||||
getTTypeGlobalReference(GV, Mang, MMI, Encoding, Streamer);
|
||||
}
|
||||
|
||||
MCSymbol *X86_64MachoTargetObjectFile::
|
||||
|
@ -21,9 +21,9 @@ namespace llvm {
|
||||
class X86_64MachoTargetObjectFile : public TargetLoweringObjectFileMachO {
|
||||
public:
|
||||
virtual const MCExpr *
|
||||
getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const;
|
||||
getTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang,
|
||||
MachineModuleInfo *MMI, unsigned Encoding,
|
||||
MCStreamer &Streamer) const;
|
||||
|
||||
// getCFIPersonalitySymbol - The symbol that gets passed to
|
||||
// .cfi_personality.
|
||||
|
44
test/CodeGen/ARM/arm-ttype-target2.ll
Normal file
44
test/CodeGen/ARM/arm-ttype-target2.ll
Normal file
@ -0,0 +1,44 @@
|
||||
; RUN: llc -mtriple=armv7-none-linux-gnueabi -arm-enable-ehabi -arm-enable-ehabi-descriptors < %s | FileCheck %s
|
||||
|
||||
@_ZTVN10__cxxabiv117__class_type_infoE = external global i8*
|
||||
@_ZTS3Foo = linkonce_odr constant [5 x i8] c"3Foo\00"
|
||||
@_ZTI3Foo = linkonce_odr unnamed_addr constant { i8*, i8* } { i8* bitcast (i8** getelementptr inbounds (i8** @_ZTVN10__cxxabiv117__class_type_infoE, i32 2) to i8*), i8* getelementptr inbounds ([5 x i8]* @_ZTS3Foo, i32 0, i32 0) }
|
||||
|
||||
define i32 @main() {
|
||||
entry:
|
||||
invoke void @_Z3foov()
|
||||
to label %return unwind label %lpad
|
||||
|
||||
lpad: ; preds = %entry
|
||||
%0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||
catch i8* bitcast ({ i8*, i8* }* @_ZTI3Foo to i8*)
|
||||
%1 = extractvalue { i8*, i32 } %0, 1
|
||||
%2 = tail call i32 @llvm.eh.typeid.for(i8* bitcast ({ i8*, i8* }* @_ZTI3Foo to i8*)) nounwind
|
||||
; CHECK: _ZTI3Foo(target2)
|
||||
|
||||
%matches = icmp eq i32 %1, %2
|
||||
br i1 %matches, label %catch, label %eh.resume
|
||||
|
||||
catch: ; preds = %lpad
|
||||
%3 = extractvalue { i8*, i32 } %0, 0
|
||||
%4 = tail call i8* @__cxa_begin_catch(i8* %3) nounwind
|
||||
tail call void @__cxa_end_catch()
|
||||
br label %return
|
||||
|
||||
return: ; preds = %entry, %catch
|
||||
%retval.0 = phi i32 [ 1, %catch ], [ 0, %entry ]
|
||||
ret i32 %retval.0
|
||||
|
||||
eh.resume: ; preds = %lpad
|
||||
resume { i8*, i32 } %0
|
||||
}
|
||||
|
||||
declare void @_Z3foov()
|
||||
|
||||
declare i32 @__gxx_personality_v0(...)
|
||||
|
||||
declare i32 @llvm.eh.typeid.for(i8*) nounwind readnone
|
||||
|
||||
declare i8* @__cxa_begin_catch(i8*)
|
||||
|
||||
declare void @__cxa_end_catch()
|
Loading…
Reference in New Issue
Block a user