mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
8adb2a7148
Add support for the new relocations and linking metadata section support in https://github.com/WebAssembly/tool-conventions/blob/master/Linking.md. In particular, this allows LLVM to indicate which variable is the stack pointer, so that it can be linked with other objects. This also adds support for emitting type relocations for call_indirect instructions. Right now, this is mainly tested by using wabt and hexdump to examine the output on selected testcases. We'll add more tests as the design stablizes and more of the pieces are in place. llvm-svn: 299141
110 lines
3.6 KiB
C++
110 lines
3.6 KiB
C++
//===-- llvm/CodeGen/MachineModuleInfoImpls.h -------------------*- 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 object-file format specific implementations of
|
|
// MachineModuleInfoImpl.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H
|
|
#define LLVM_CODEGEN_MACHINEMODULEINFOIMPLS_H
|
|
|
|
#include "llvm/CodeGen/ValueTypes.h"
|
|
#include "llvm/CodeGen/MachineModuleInfo.h"
|
|
#include "llvm/Support/Wasm.h"
|
|
|
|
namespace llvm {
|
|
class MCSymbol;
|
|
|
|
/// MachineModuleInfoMachO - This is a MachineModuleInfoImpl implementation
|
|
/// for MachO targets.
|
|
class MachineModuleInfoMachO : public MachineModuleInfoImpl {
|
|
/// GVStubs - Darwin '$non_lazy_ptr' stubs. The key is something like
|
|
/// "Lfoo$non_lazy_ptr", the value is something like "_foo". The extra bit
|
|
/// is true if this GV is external.
|
|
DenseMap<MCSymbol *, StubValueTy> GVStubs;
|
|
|
|
/// ThreadLocalGVStubs - Darwin '$non_lazy_ptr' stubs. The key is something
|
|
/// like "Lfoo$non_lazy_ptr", the value is something like "_foo". The extra
|
|
/// bit is true if this GV is external.
|
|
DenseMap<MCSymbol *, StubValueTy> ThreadLocalGVStubs;
|
|
|
|
virtual void anchor(); // Out of line virtual method.
|
|
public:
|
|
MachineModuleInfoMachO(const MachineModuleInfo &) {}
|
|
|
|
StubValueTy &getGVStubEntry(MCSymbol *Sym) {
|
|
assert(Sym && "Key cannot be null");
|
|
return GVStubs[Sym];
|
|
}
|
|
|
|
StubValueTy &getThreadLocalGVStubEntry(MCSymbol *Sym) {
|
|
assert(Sym && "Key cannot be null");
|
|
return ThreadLocalGVStubs[Sym];
|
|
}
|
|
|
|
/// Accessor methods to return the set of stubs in sorted order.
|
|
SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
|
|
SymbolListTy GetThreadLocalGVStubList() {
|
|
return getSortedStubs(ThreadLocalGVStubs);
|
|
}
|
|
};
|
|
|
|
/// MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation
|
|
/// for ELF targets.
|
|
class MachineModuleInfoELF : public MachineModuleInfoImpl {
|
|
/// GVStubs - These stubs are used to materialize global addresses in PIC
|
|
/// mode.
|
|
DenseMap<MCSymbol *, StubValueTy> GVStubs;
|
|
|
|
virtual void anchor(); // Out of line virtual method.
|
|
public:
|
|
MachineModuleInfoELF(const MachineModuleInfo &) {}
|
|
|
|
StubValueTy &getGVStubEntry(MCSymbol *Sym) {
|
|
assert(Sym && "Key cannot be null");
|
|
return GVStubs[Sym];
|
|
}
|
|
|
|
/// Accessor methods to return the set of stubs in sorted order.
|
|
|
|
SymbolListTy GetGVStubList() { return getSortedStubs(GVStubs); }
|
|
};
|
|
|
|
/// MachineModuleInfoWasm - This is a MachineModuleInfoImpl implementation
|
|
/// for Wasm targets.
|
|
class MachineModuleInfoWasm : public MachineModuleInfoImpl {
|
|
/// WebAssembly global variables defined by CodeGen.
|
|
std::vector<wasm::Global> Globals;
|
|
|
|
/// The WebAssembly global variable which is the stack pointer.
|
|
unsigned StackPointerGlobal;
|
|
|
|
virtual void anchor(); // Out of line virtual method.
|
|
public:
|
|
MachineModuleInfoWasm(const MachineModuleInfo &)
|
|
: StackPointerGlobal(-1U) {}
|
|
|
|
void addGlobal(const wasm::Global &G) { Globals.push_back(G); }
|
|
const std::vector<wasm::Global> &getGlobals() const { return Globals; }
|
|
|
|
bool hasStackPointerGlobal() const {
|
|
return StackPointerGlobal != -1U;
|
|
}
|
|
unsigned getStackPointerGlobal() const {
|
|
assert(hasStackPointerGlobal() && "Stack ptr global hasn't been set");
|
|
return StackPointerGlobal;
|
|
}
|
|
void setStackPointerGlobal(unsigned Global) { StackPointerGlobal = Global; }
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|