[llvm-commits] [llvm] r116675 - in /llvm/trunk: include/llvm/MC/MCExpr.h include/llvm/MC/MCObjectFormat.h include/llvm/Target/TargetAsmBackend.h lib/MC/CMakeLists.txt lib/MC/ELFObjectWriter.cpp lib/MC/MCExpr.cpp lib/MC/MCObjectFormat.cpp lib/MC/TargetAsmBackend.cpp lib/Target/ARM/ARMAsmBackend.cpp lib/Target/X86/X86AsmBackend.cpp test/MC/ELF/diff.s test/MC/ELF/diff2.s
Rafael Espindola
rafael.espindola at gmail.com
Sat Oct 16 11:23:53 PDT 2010
Author: rafael
Date: Sat Oct 16 13:23:53 2010
New Revision: 116675
URL: http://llvm.org/viewvc/llvm-project?rev=116675&view=rev
Log:
Add a MCObjectFormat class so that code common to all targets that use a
single object format can be shared.
This also adds support for
mov zed+(bar-foo), %eax
on ELF and COFF targets.
Added:
llvm/trunk/include/llvm/MC/MCObjectFormat.h
llvm/trunk/lib/MC/MCObjectFormat.cpp
llvm/trunk/test/MC/ELF/diff.s
llvm/trunk/test/MC/ELF/diff2.s
Modified:
llvm/trunk/include/llvm/MC/MCExpr.h
llvm/trunk/include/llvm/Target/TargetAsmBackend.h
llvm/trunk/lib/MC/CMakeLists.txt
llvm/trunk/lib/MC/ELFObjectWriter.cpp
llvm/trunk/lib/MC/MCExpr.cpp
llvm/trunk/lib/MC/TargetAsmBackend.cpp
llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp
llvm/trunk/lib/Target/X86/X86AsmBackend.cpp
Modified: llvm/trunk/include/llvm/MC/MCExpr.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCExpr.h?rev=116675&r1=116674&r2=116675&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCExpr.h (original)
+++ llvm/trunk/include/llvm/MC/MCExpr.h Sat Oct 16 13:23:53 2010
@@ -43,6 +43,8 @@
protected:
explicit MCExpr(ExprKind _Kind) : Kind(_Kind) {}
+ bool EvaluateAsRelocatableImpl(MCValue &Res, const MCAsmLayout *Layout,
+ bool InSet) const;
public:
/// @name Accessors
/// @{
Added: llvm/trunk/include/llvm/MC/MCObjectFormat.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectFormat.h?rev=116675&view=auto
==============================================================================
--- llvm/trunk/include/llvm/MC/MCObjectFormat.h (added)
+++ llvm/trunk/include/llvm/MC/MCObjectFormat.h Sat Oct 16 13:23:53 2010
@@ -0,0 +1,52 @@
+//===-- llvm/MC/MCObjectFormat.h - Object Format Info -----------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_MC_MCOBJECTFORMAT_H
+#define LLVM_MC_MCOBJECTFORMAT_H
+
+namespace llvm {
+class MCSymbol;
+
+class MCObjectFormat {
+public:
+ /// isAbsolute - Check if A - B is an absolute value
+ ///
+ /// \param InSet - True if this expression is in a set. For example:
+ /// a:
+ /// ...
+ /// b:
+ /// tmp = a - b
+ /// .long tmp
+ /// \param A - LHS
+ /// \param B - RHS
+ virtual bool isAbsolute(bool InSet, const MCSymbol &A,
+ const MCSymbol &B) const = 0;
+};
+
+class MCELFObjectFormat : public MCObjectFormat {
+public:
+ virtual bool isAbsolute(bool InSet, const MCSymbol &A,
+ const MCSymbol &B) const;
+};
+
+class MCMachOObjectFormat : public MCObjectFormat {
+public:
+ virtual bool isAbsolute(bool InSet, const MCSymbol &A,
+ const MCSymbol &B) const;
+};
+
+class MCCOFFObjectFormat : public MCObjectFormat {
+public:
+ virtual bool isAbsolute(bool InSet, const MCSymbol &A,
+ const MCSymbol &B) const;
+};
+
+} // End llvm namespace
+
+#endif
Modified: llvm/trunk/include/llvm/Target/TargetAsmBackend.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetAsmBackend.h?rev=116675&r1=116674&r2=116675&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Target/TargetAsmBackend.h (original)
+++ llvm/trunk/include/llvm/Target/TargetAsmBackend.h Sat Oct 16 13:23:53 2010
@@ -16,6 +16,7 @@
class MCDataFragment;
class MCFixup;
class MCInst;
+class MCObjectFormat;
class MCObjectWriter;
class MCSection;
template<typename T>
@@ -33,7 +34,6 @@
/// TheTarget - The Target that this machine was created for.
const Target &TheTarget;
- unsigned HasAbsolutizedSet : 1;
unsigned HasReliableSymbolDifference : 1;
unsigned HasScatteredSymbols : 1;
@@ -42,23 +42,12 @@
const Target &getTarget() const { return TheTarget; }
+ virtual const MCObjectFormat &getObjectFormat() const = 0;
+
/// createObjectWriter - Create a new MCObjectWriter instance for use by the
/// assembler backend to emit the final object file.
virtual MCObjectWriter *createObjectWriter(raw_ostream &OS) const = 0;
- /// hasAbsolutizedSet - Check whether this target "absolutizes"
- /// assignments. That is, given code like:
- /// a:
- /// ...
- /// b:
- /// tmp = a - b
- /// .long tmp
- /// will the value of 'tmp' be a relocatable expression, or the assembly time
- /// 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.
- 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
@@ -68,7 +57,7 @@
/// 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.
+ /// eventually should be eliminated.
bool hasReliableSymbolDifference() const {
return HasReliableSymbolDifference;
}
Modified: llvm/trunk/lib/MC/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/CMakeLists.txt?rev=116675&r1=116674&r2=116675&view=diff
==============================================================================
--- llvm/trunk/lib/MC/CMakeLists.txt (original)
+++ llvm/trunk/lib/MC/CMakeLists.txt Sat Oct 16 13:23:53 2010
@@ -18,6 +18,7 @@
MCMachOStreamer.cpp
MCNullStreamer.cpp
MCObjectStreamer.cpp
+ MCObjectFormat.cpp
MCObjectWriter.cpp
MCSection.cpp
MCSectionCOFF.cpp
Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=116675&r1=116674&r2=116675&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Sat Oct 16 13:23:53 2010
@@ -472,22 +472,11 @@
const MCBinaryExpr *BE = static_cast<const MCBinaryExpr *>(ESize);
if (BE->EvaluateAsRelocatable(Res, &Layout)) {
- uint64_t AddressA = 0;
- uint64_t AddressB = 0;
- const MCSymbol &SymA = Res.getSymA()->getSymbol();
- const MCSymbol &SymB = Res.getSymB()->getSymbol();
-
- if (SymA.isDefined()) {
- MCSymbolData &A = Layout.getAssembler().getSymbolData(SymA);
- AddressA = Layout.getSymbolAddress(&A);
- }
-
- if (SymB.isDefined()) {
- MCSymbolData &B = Layout.getAssembler().getSymbolData(SymB);
- AddressB = Layout.getSymbolAddress(&B);
- }
-
- Size = AddressA - AddressB;
+ const llvm::MCSymbolRefExpr *A = Res.getSymA();
+ const llvm::MCSymbolRefExpr *B = Res.getSymA();
+ assert(!A || !A->getSymbol().isDefined());
+ assert(!B || !B->getSymbol().isDefined());
+ Size = Res.getConstant();
}
} else if (ESize->getKind() == MCExpr::Constant) {
Size = static_cast<const MCConstantExpr *>(ESize)->getValue();
Modified: llvm/trunk/lib/MC/MCExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCExpr.cpp?rev=116675&r1=116674&r2=116675&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCExpr.cpp (original)
+++ llvm/trunk/lib/MC/MCExpr.cpp Sat Oct 16 13:23:53 2010
@@ -14,6 +14,7 @@
#include "llvm/MC/MCAsmLayout.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCContext.h"
+#include "llvm/MC/MCObjectFormat.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/MC/MCValue.h"
#include "llvm/Support/Debug.h"
@@ -237,7 +238,8 @@
return true;
}
-static bool EvaluateSymbolicAdd(const MCValue &LHS,const MCSymbolRefExpr *RHS_A,
+static bool EvaluateSymbolicAdd(const MCAsmLayout *Layout, bool InSet,
+ const MCValue &LHS,const MCSymbolRefExpr *RHS_A,
const MCSymbolRefExpr *RHS_B, int64_t RHS_Cst,
MCValue &Res) {
// We can't add or subtract two symbols.
@@ -255,12 +257,40 @@
if (!A)
return false;
}
+
+ // Absolutize symbol differences between defined symbols when we have a
+ // layout object and the target requests it.
+
+ if (Layout && A && B) {
+ const MCSymbol &SA = A->getSymbol();
+ const MCSymbol &SB = B->getSymbol();
+ const MCObjectFormat &F =
+ Layout->getAssembler().getBackend().getObjectFormat();
+ if (SA.isDefined() && SB.isDefined() && F.isAbsolute(InSet, SA, SB)) {
+ const MCAssembler &Asm = Layout->getAssembler();
+ MCSymbolData &AD = Asm.getSymbolData(A->getSymbol());
+ MCSymbolData &BD = Asm.getSymbolData(B->getSymbol());
+ Res = MCValue::get(+ Layout->getSymbolAddress(&AD)
+ - Layout->getSymbolAddress(&BD)
+ + LHS.getConstant()
+ + RHS_Cst);
+ return true;
+ }
+ }
+
+
Res = MCValue::get(A, B, LHS.getConstant() + RHS_Cst);
return true;
}
bool MCExpr::EvaluateAsRelocatable(MCValue &Res,
const MCAsmLayout *Layout) const {
+ return EvaluateAsRelocatableImpl(Res, Layout, false);
+}
+
+bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
+ const MCAsmLayout *Layout,
+ bool InSet) const {
++stats::MCExprEvaluate;
switch (getKind()) {
@@ -276,27 +306,9 @@
const MCSymbol &Sym = SRE->getSymbol();
// Evaluate recursively if this is a variable.
- if (Sym.isVariable()) {
- if (!Sym.getVariableValue()->EvaluateAsRelocatable(Res, Layout))
- return false;
-
- // Absolutize symbol differences between defined symbols when we have a
- // layout object and the target requests it.
- if (Layout && Res.getSymB() &&
- Layout->getAssembler().getBackend().hasAbsolutizedSet() &&
- Res.getSymA()->getSymbol().isDefined() &&
- Res.getSymB()->getSymbol().isDefined()) {
- MCSymbolData &A =
- Layout->getAssembler().getSymbolData(Res.getSymA()->getSymbol());
- MCSymbolData &B =
- Layout->getAssembler().getSymbolData(Res.getSymB()->getSymbol());
- Res = MCValue::get(+ Layout->getSymbolAddress(&A)
- - Layout->getSymbolAddress(&B)
- + Res.getConstant());
- }
-
- return true;
- }
+ if (Sym.isVariable())
+ return Sym.getVariableValue()->EvaluateAsRelocatableImpl(Res, Layout,
+ true);
Res = MCValue::get(SRE, 0, 0);
return true;
@@ -306,7 +318,7 @@
const MCUnaryExpr *AUE = cast<MCUnaryExpr>(this);
MCValue Value;
- if (!AUE->getSubExpr()->EvaluateAsRelocatable(Value, Layout))
+ if (!AUE->getSubExpr()->EvaluateAsRelocatableImpl(Value, Layout, InSet))
return false;
switch (AUE->getOpcode()) {
@@ -339,8 +351,8 @@
const MCBinaryExpr *ABE = cast<MCBinaryExpr>(this);
MCValue LHSValue, RHSValue;
- if (!ABE->getLHS()->EvaluateAsRelocatable(LHSValue, Layout) ||
- !ABE->getRHS()->EvaluateAsRelocatable(RHSValue, Layout))
+ if (!ABE->getLHS()->EvaluateAsRelocatableImpl(LHSValue, Layout, InSet) ||
+ !ABE->getRHS()->EvaluateAsRelocatableImpl(RHSValue, Layout, InSet))
return false;
// We only support a few operations on non-constant expressions, handle
@@ -351,13 +363,13 @@
return false;
case MCBinaryExpr::Sub:
// Negate RHS and add.
- return EvaluateSymbolicAdd(LHSValue,
+ return EvaluateSymbolicAdd(Layout, InSet, LHSValue,
RHSValue.getSymB(), RHSValue.getSymA(),
-RHSValue.getConstant(),
Res);
case MCBinaryExpr::Add:
- return EvaluateSymbolicAdd(LHSValue,
+ return EvaluateSymbolicAdd(Layout, InSet, LHSValue,
RHSValue.getSymA(), RHSValue.getSymB(),
RHSValue.getConstant(),
Res);
Added: llvm/trunk/lib/MC/MCObjectFormat.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectFormat.cpp?rev=116675&view=auto
==============================================================================
--- llvm/trunk/lib/MC/MCObjectFormat.cpp (added)
+++ llvm/trunk/lib/MC/MCObjectFormat.cpp Sat Oct 16 13:23:53 2010
@@ -0,0 +1,31 @@
+//===- lib/MC/MCObjectFormat.cpp - MCObjectFormat implementation ----------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/MC/MCObjectFormat.h"
+#include "llvm/MC/MCSymbol.h"
+
+using namespace llvm;
+
+bool MCELFObjectFormat::isAbsolute(bool IsSet, const MCSymbol &A,
+ const MCSymbol &B) const {
+ // On ELF A - B is absolute if A and B are in the same section.
+ return &A.getSection() == &B.getSection();
+}
+
+bool MCMachOObjectFormat::isAbsolute(bool IsSet, const MCSymbol &A,
+ const MCSymbol &B) const {
+ // On MachO A - B is absolute only if in a set.
+ return IsSet;
+}
+
+bool MCCOFFObjectFormat::isAbsolute(bool IsSet, const MCSymbol &A,
+ const MCSymbol &B) const {
+ // On COFF A - B is absolute if A and B are in the same section.
+ return &A.getSection() == &B.getSection();
+}
Modified: llvm/trunk/lib/MC/TargetAsmBackend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/TargetAsmBackend.cpp?rev=116675&r1=116674&r2=116675&view=diff
==============================================================================
--- llvm/trunk/lib/MC/TargetAsmBackend.cpp (original)
+++ llvm/trunk/lib/MC/TargetAsmBackend.cpp Sat Oct 16 13:23:53 2010
@@ -12,7 +12,6 @@
TargetAsmBackend::TargetAsmBackend(const Target &T)
: TheTarget(T),
- HasAbsolutizedSet(false),
HasReliableSymbolDifference(false),
HasScatteredSymbols(false)
{
Modified: llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp?rev=116675&r1=116674&r2=116675&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMAsmBackend.cpp Sat Oct 16 13:23:53 2010
@@ -14,6 +14,7 @@
#include "llvm/MC/ELFObjectWriter.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCExpr.h"
+#include "llvm/MC/MCObjectFormat.h"
#include "llvm/MC/MCObjectWriter.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/MC/MCSectionMachO.h"
@@ -66,14 +67,19 @@
// FIXME: This should be in a separate file.
// ELF is an ELF of course...
class ELFARMAsmBackend : public ARMAsmBackend {
+ MCELFObjectFormat Format;
+
public:
Triple::OSType OSType;
ELFARMAsmBackend(const Target &T, Triple::OSType _OSType)
: ARMAsmBackend(T), OSType(_OSType) {
- HasAbsolutizedSet = true;
HasScatteredSymbols = true;
}
+ virtual const MCObjectFormat &getObjectFormat() const {
+ return Format;
+ }
+
void ApplyFixup(const MCFixup &Fixup, MCDataFragment &DF,
uint64_t Value) const;
@@ -98,14 +104,19 @@
// FIXME: This should be in a separate file.
class DarwinARMAsmBackend : public ARMAsmBackend {
+ MCMachOObjectFormat Format;
+
public:
DarwinARMAsmBackend(const Target &T)
: ARMAsmBackend(T) {
- HasAbsolutizedSet = true;
HasScatteredSymbols = true;
assert(0 && "DarwinARMAsmBackend::DarwinARMAsmBackend() unimplemented");
}
+ virtual const MCObjectFormat &getObjectFormat() const {
+ return Format;
+ }
+
void ApplyFixup(const MCFixup &Fixup, MCDataFragment &DF,
uint64_t Value) const;
Modified: llvm/trunk/lib/Target/X86/X86AsmBackend.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmBackend.cpp?rev=116675&r1=116674&r2=116675&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86AsmBackend.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86AsmBackend.cpp Sat Oct 16 13:23:53 2010
@@ -14,6 +14,7 @@
#include "llvm/MC/ELFObjectWriter.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCExpr.h"
+#include "llvm/MC/MCObjectFormat.h"
#include "llvm/MC/MCObjectWriter.h"
#include "llvm/MC/MCSectionCOFF.h"
#include "llvm/MC/MCSectionELF.h"
@@ -186,15 +187,20 @@
namespace {
class ELFX86AsmBackend : public X86AsmBackend {
+ MCELFObjectFormat Format;
+
public:
Triple::OSType OSType;
ELFX86AsmBackend(const Target &T, Triple::OSType _OSType)
: X86AsmBackend(T), OSType(_OSType) {
- HasAbsolutizedSet = true;
HasScatteredSymbols = true;
HasReliableSymbolDifference = true;
}
+ virtual const MCObjectFormat &getObjectFormat() const {
+ return Format;
+ }
+
virtual bool doesSectionRequireSymbols(const MCSection &Section) const {
const MCSectionELF &ES = static_cast<const MCSectionELF&>(Section);
return ES.getFlags() & MCSectionELF::SHF_MERGE;
@@ -242,6 +248,8 @@
class WindowsX86AsmBackend : public X86AsmBackend {
bool Is64Bit;
+ MCCOFFObjectFormat Format;
+
public:
WindowsX86AsmBackend(const Target &T, bool is64Bit)
: X86AsmBackend(T)
@@ -249,6 +257,10 @@
HasScatteredSymbols = true;
}
+ virtual const MCObjectFormat &getObjectFormat() const {
+ return Format;
+ }
+
unsigned getPointerSize() const {
if (Is64Bit)
return 8;
@@ -267,13 +279,18 @@
};
class DarwinX86AsmBackend : public X86AsmBackend {
+ MCMachOObjectFormat Format;
+
public:
DarwinX86AsmBackend(const Target &T)
: X86AsmBackend(T) {
- HasAbsolutizedSet = true;
HasScatteredSymbols = true;
}
+ virtual const MCObjectFormat &getObjectFormat() const {
+ return Format;
+ }
+
bool isVirtualSection(const MCSection &Section) const {
const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);
return (SMO.getType() == MCSectionMachO::S_ZEROFILL ||
Added: llvm/trunk/test/MC/ELF/diff.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/diff.s?rev=116675&view=auto
==============================================================================
--- llvm/trunk/test/MC/ELF/diff.s (added)
+++ llvm/trunk/test/MC/ELF/diff.s Sat Oct 16 13:23:53 2010
@@ -0,0 +1,15 @@
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s
+
+ .global zed
+foo:
+ nop
+bar:
+ nop
+zed:
+ mov zed+(bar-foo), %eax
+
+// CHECK: # Relocation 0
+// CHECK-NEXT: (('r_offset', 5)
+// CHECK-NEXT: ('r_sym', 6)
+// CHECK-NEXT: ('r_type', 11)
+// CHECK-NEXT: ('r_addend', 1)
Added: llvm/trunk/test/MC/ELF/diff2.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/diff2.s?rev=116675&view=auto
==============================================================================
--- llvm/trunk/test/MC/ELF/diff2.s (added)
+++ llvm/trunk/test/MC/ELF/diff2.s Sat Oct 16 13:23:53 2010
@@ -0,0 +1,13 @@
+// RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s 2> %t
+// RUN: FileCheck -input-file %t %s
+
+.global zed
+ .data
+foo:
+ .text
+ nop
+bar:
+ nop
+zed:
+// CHECK: expected relocatable expression
+ mov zed+(bar-foo), %eax
More information about the llvm-commits
mailing list