mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
47008fdea7
The way prelink used to work was * The compiler decides if a given section only has relocations that are know to point to the same DSO. If so, it names it .data.rel.ro.local<something>. * The static linker puts all of these together. * The prelinker program assigns addresses to each library and resolves the local relocations. There are many problems with this: * It is incompatible with address space randomization. * The information passed by the compiler is redundant. The linker knows if a given relocation is in the same DSO or not. If could sort by that if so desired. * There are newer ways of speeding up DSO (gnu hash for example). * Even if we want to implement this again in the compiler, the previous implementation is pretty broken. It talks about relocations that are "resolved by the static linker". If they are resolved, there are none left for the prelinker. What one needs to track is if an expression will require only dynamic relocations that point to the same DSO. At this point it looks like the prelinker is an historical curiosity. For example, fedora has retired it because it failed to build for two releases (http://pkgs.fedoraproject.org/cgit/prelink.git/commit/?id=eb43100a8331d91c801ee3dcdb0a0bb9babfdc1f) This patch removes support for it. That is, it stops printing the ".local" sections. llvm-svn: 253280
59 lines
1.7 KiB
C++
59 lines
1.7 KiB
C++
//===- SystemZConstantPoolValue.h - SystemZ constant-pool value -*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZCONSTANTPOOLVALUE_H
|
|
#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZCONSTANTPOOLVALUE_H
|
|
|
|
#include "llvm/CodeGen/MachineConstantPool.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
|
|
namespace llvm {
|
|
|
|
class GlobalValue;
|
|
|
|
namespace SystemZCP {
|
|
enum SystemZCPModifier {
|
|
TLSGD,
|
|
TLSLDM,
|
|
DTPOFF,
|
|
NTPOFF
|
|
};
|
|
} // end namespace SystemZCP
|
|
|
|
/// A SystemZ-specific constant pool value. At present, the only
|
|
/// defined constant pool values are module IDs or offsets of
|
|
/// thread-local variables (written x@TLSGD, x@TLSLDM, x@DTPOFF,
|
|
/// or x@NTPOFF).
|
|
class SystemZConstantPoolValue : public MachineConstantPoolValue {
|
|
const GlobalValue *GV;
|
|
SystemZCP::SystemZCPModifier Modifier;
|
|
|
|
protected:
|
|
SystemZConstantPoolValue(const GlobalValue *GV,
|
|
SystemZCP::SystemZCPModifier Modifier);
|
|
|
|
public:
|
|
static SystemZConstantPoolValue *
|
|
Create(const GlobalValue *GV, SystemZCP::SystemZCPModifier Modifier);
|
|
|
|
// Override MachineConstantPoolValue.
|
|
int getExistingMachineCPValue(MachineConstantPool *CP,
|
|
unsigned Alignment) override;
|
|
void addSelectionDAGCSEId(FoldingSetNodeID &ID) override;
|
|
void print(raw_ostream &O) const override;
|
|
|
|
// Access SystemZ-specific fields.
|
|
const GlobalValue *getGlobalValue() const { return GV; }
|
|
SystemZCP::SystemZCPModifier getModifier() const { return Modifier; }
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|