MC/Darwin: Add a new target hook for whether the target uses "reliable" symbol differences, basically whether the assembler should attempt to understand atoms when using scattered symbols.

Also, avoid some virtual call overhead.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@98789 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Daniel Dunbar 2010-03-18 00:58:53 +00:00
parent ec1176a206
commit 0682951b4f
3 changed files with 31 additions and 9 deletions

View File

@ -24,6 +24,10 @@ protected: // Can only create subclasses.
/// TheTarget - The Target that this machine was created for.
const Target &TheTarget;
unsigned HasAbsolutizedSet : 1;
unsigned HasReliableSymbolDifference : 1;
unsigned HasScatteredSymbols : 1;
public:
virtual ~TargetAsmBackend();
@ -40,7 +44,21 @@ public:
/// value of L0 - L1. This distinction is only relevant for platforms that
/// support scattered symbols, since in the absence of scattered symbols (a -
/// b) cannot change after assembly.
virtual bool hasAbsolutizedSet() const { return false; }
bool hasAbsolutizedSet() const { return HasAbsolutizedSet; }
/// hasReliableSymbolDifference - Check whether this target implements
/// accurate relocations for differences between symbols. If not, differences
/// between symbols will always be relocatable expressions and any references
/// to temporary symbols will be assumed to be in the same atom, unless they
/// reside in a different section.
///
/// This should always be true (since it results in fewer relocations with no
/// loss of functionality), but is currently supported as a way to maintain
/// exact object compatibility with Darwin 'as' (on non-x86_64). It should
/// eventually should be eliminated. See also \see hasAbsolutizedSet.
bool hasReliableSymbolDifference() const {
return HasReliableSymbolDifference;
}
/// hasScatteredSymbols - Check whether this target supports scattered
/// symbols. If so, the assembler should assume that atoms can be scattered by
@ -50,7 +68,7 @@ public:
///
/// Note that the assembler currently does not reason about atoms, instead it
/// assumes all temporary symbols reside in the "current atom".
virtual bool hasScatteredSymbols() const { return false; }
bool hasScatteredSymbols() const { return HasScatteredSymbols; }
/// doesSectionRequireSymbols - Check whether the given section requires that
/// all symbols (even temporaries) have symbol table entries.

View File

@ -11,7 +11,10 @@
using namespace llvm;
TargetAsmBackend::TargetAsmBackend(const Target &T)
: TheTarget(T)
: TheTarget(T),
HasAbsolutizedSet(false),
HasReliableSymbolDifference(false),
HasScatteredSymbols(false)
{
}

View File

@ -25,11 +25,10 @@ public:
class DarwinX86AsmBackend : public X86AsmBackend {
public:
DarwinX86AsmBackend(const Target &T)
: X86AsmBackend(T) {}
virtual bool hasAbsolutizedSet() const { return true; }
virtual bool hasScatteredSymbols() const { return true; }
: X86AsmBackend(T) {
HasAbsolutizedSet = true;
HasScatteredSymbols = true;
}
};
class DarwinX86_32AsmBackend : public DarwinX86AsmBackend {
@ -41,7 +40,9 @@ public:
class DarwinX86_64AsmBackend : public DarwinX86AsmBackend {
public:
DarwinX86_64AsmBackend(const Target &T)
: DarwinX86AsmBackend(T) {}
: DarwinX86AsmBackend(T) {
HasReliableSymbolDifference = true;
}
virtual bool doesSectionRequireSymbols(const MCSection &Section) const {
// Temporary labels in the string literals sections require symbols. The