summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/MC/MCMachObjectWriter.h2
-rw-r--r--llvm/include/llvm/MC/MCSymbol.h26
-rw-r--r--llvm/lib/MC/MCExpr.cpp3
-rw-r--r--llvm/lib/MC/MCSymbol.cpp8
-rw-r--r--llvm/lib/MC/MachObjectWriter.cpp21
-rw-r--r--llvm/lib/Target/X86/X86AsmPrinter.cpp1
-rw-r--r--llvm/test/MC/ELF/alias-resolve.s8
-rw-r--r--llvm/test/MC/ELF/alias.s9
-rw-r--r--llvm/test/MC/MachO/ARM/aliased-symbols.s10
9 files changed, 45 insertions, 43 deletions
diff --git a/llvm/include/llvm/MC/MCMachObjectWriter.h b/llvm/include/llvm/MC/MCMachObjectWriter.h
index 3d270ce7e0d..514700bce35 100644
--- a/llvm/include/llvm/MC/MCMachObjectWriter.h
+++ b/llvm/include/llvm/MC/MCMachObjectWriter.h
@@ -257,6 +257,8 @@ public:
void computeSectionAddresses(const MCAssembler &Asm,
const MCAsmLayout &Layout);
+ void markAbsoluteVariableSymbols(MCAssembler &Asm,
+ const MCAsmLayout &Layout);
void ExecutePostLayoutBinding(MCAssembler &Asm,
const MCAsmLayout &Layout) override;
diff --git a/llvm/include/llvm/MC/MCSymbol.h b/llvm/include/llvm/MC/MCSymbol.h
index e4bdfda55d6..53443b01d96 100644
--- a/llvm/include/llvm/MC/MCSymbol.h
+++ b/llvm/include/llvm/MC/MCSymbol.h
@@ -15,7 +15,6 @@
#define LLVM_MC_MCSYMBOL_H
#include "llvm/ADT/StringRef.h"
-#include "llvm/MC/MCExpr.h"
#include "llvm/Support/Compiler.h"
namespace llvm {
@@ -43,9 +42,8 @@ namespace llvm {
/// Section - The section the symbol is defined in. This is null for
/// undefined symbols, and the special AbsolutePseudoSection value for
- /// absolute symbols. If this is a variable symbol, this caches the
- /// variable value's section.
- mutable const MCSection *Section;
+ /// absolute symbols.
+ const MCSection *Section;
/// Value - If non-null, the value for a variable symbol.
const MCExpr *Value;
@@ -70,12 +68,6 @@ namespace llvm {
MCSymbol(const MCSymbol&) = delete;
void operator=(const MCSymbol&) = delete;
- const MCSection *getSectionPtr() const {
- if (Section || !Value)
- return Section;
- return Section = Value->FindAssociatedSection();
- }
-
public:
/// getName - Get the symbol name.
StringRef getName() const { return Name; }
@@ -111,7 +103,7 @@ namespace llvm {
///
/// Defined symbols are either absolute or in some section.
bool isDefined() const {
- return getSectionPtr() != nullptr;
+ return Section != nullptr;
}
/// isInSection - Check if this symbol is defined in some section (i.e., it
@@ -127,27 +119,27 @@ namespace llvm {
/// isAbsolute - Check if this is an absolute symbol.
bool isAbsolute() const {
- return getSectionPtr() == AbsolutePseudoSection;
+ return Section == AbsolutePseudoSection;
}
/// getSection - Get the section associated with a defined, non-absolute
/// symbol.
const MCSection &getSection() const {
assert(isInSection() && "Invalid accessor!");
- return *getSectionPtr();
+ return *Section;
}
/// setSection - Mark the symbol as defined in the section \p S.
- void setSection(const MCSection &S) {
- assert(!isVariable() && "Cannot set section of variable");
- Section = &S;
- }
+ void setSection(const MCSection &S) { Section = &S; }
/// setUndefined - Mark the symbol as undefined.
void setUndefined() {
Section = nullptr;
}
+ /// setAbsolute - Mark the symbol as absolute.
+ void setAbsolute() { Section = AbsolutePseudoSection; }
+
/// @}
/// @name Variable Symbols
/// @{
diff --git a/llvm/lib/MC/MCExpr.cpp b/llvm/lib/MC/MCExpr.cpp
index 995f4c96ee6..8a64403362c 100644
--- a/llvm/lib/MC/MCExpr.cpp
+++ b/llvm/lib/MC/MCExpr.cpp
@@ -775,9 +775,6 @@ const MCSection *MCExpr::FindAssociatedSection() const {
if (RHS_S == MCSymbol::AbsolutePseudoSection)
return LHS_S;
- if (BE->getOpcode() == MCBinaryExpr::Sub)
- return MCSymbol::AbsolutePseudoSection;
-
// Otherwise, return the first non-null section.
return LHS_S ? LHS_S : RHS_S;
}
diff --git a/llvm/lib/MC/MCSymbol.cpp b/llvm/lib/MC/MCSymbol.cpp
index 6582574ae94..24165254e56 100644
--- a/llvm/lib/MC/MCSymbol.cpp
+++ b/llvm/lib/MC/MCSymbol.cpp
@@ -55,7 +55,13 @@ void MCSymbol::setVariableValue(const MCExpr *Value) {
assert(!IsUsed && "Cannot set a variable that has already been used.");
assert(Value && "Invalid variable value!");
this->Value = Value;
- this->Section = nullptr;
+
+ // Variables should always be marked as in the same "section" as the value.
+ const MCSection *Section = Value->FindAssociatedSection();
+ if (Section)
+ setSection(*Section);
+ else
+ setUndefined();
}
void MCSymbol::print(raw_ostream &OS) const {
diff --git a/llvm/lib/MC/MachObjectWriter.cpp b/llvm/lib/MC/MachObjectWriter.cpp
index 56cccab1d39..5e9e86f18a0 100644
--- a/llvm/lib/MC/MachObjectWriter.cpp
+++ b/llvm/lib/MC/MachObjectWriter.cpp
@@ -649,12 +649,33 @@ void MachObjectWriter::computeSectionAddresses(const MCAssembler &Asm,
}
}
+void MachObjectWriter::markAbsoluteVariableSymbols(MCAssembler &Asm,
+ const MCAsmLayout &Layout) {
+ for (MCSymbolData &SD : Asm.symbols()) {
+ if (!SD.getSymbol().isVariable())
+ continue;
+
+ // Is the variable is a symbol difference (SA - SB + C) expression,
+ // and neither symbol is external, mark the variable as absolute.
+ const MCExpr *Expr = SD.getSymbol().getVariableValue();
+ MCValue Value;
+ if (Expr->EvaluateAsRelocatable(Value, &Layout, nullptr)) {
+ if (Value.getSymA() && Value.getSymB())
+ const_cast<MCSymbol*>(&SD.getSymbol())->setAbsolute();
+ }
+ }
+}
+
void MachObjectWriter::ExecutePostLayoutBinding(MCAssembler &Asm,
const MCAsmLayout &Layout) {
computeSectionAddresses(Asm, Layout);
// Create symbol data for any indirect symbols.
BindIndirectSymbols(Asm);
+
+ // Mark symbol difference expressions in variables (from .set or = directives)
+ // as absolute.
+ markAbsoluteVariableSymbols(Asm, Layout);
}
bool MachObjectWriter::
diff --git a/llvm/lib/Target/X86/X86AsmPrinter.cpp b/llvm/lib/Target/X86/X86AsmPrinter.cpp
index a84f0585aea..f6033a7e157 100644
--- a/llvm/lib/Target/X86/X86AsmPrinter.cpp
+++ b/llvm/lib/Target/X86/X86AsmPrinter.cpp
@@ -523,6 +523,7 @@ void X86AsmPrinter::EmitStartOfAsmFile(Module &M) {
// must be registered in .sxdata. Use of any unregistered handlers will
// cause the process to terminate immediately. LLVM does not know how to
// register any SEH handlers, so its object files should be safe.
+ S->setAbsolute();
OutStreamer.EmitSymbolAttribute(S, MCSA_Global);
OutStreamer.EmitAssignment(
S, MCConstantExpr::Create(int64_t(1), MMI->getContext()));
diff --git a/llvm/test/MC/ELF/alias-resolve.s b/llvm/test/MC/ELF/alias-resolve.s
deleted file mode 100644
index 304cacb2972..00000000000
--- a/llvm/test/MC/ELF/alias-resolve.s
+++ /dev/null
@@ -1,8 +0,0 @@
-// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -r | FileCheck %s
-
-a:
- .section foo
- c = b
-b:
- // CHECK: 0x0 R_X86_64_PC32 .text 0x0
- .long a - c
diff --git a/llvm/test/MC/ELF/alias.s b/llvm/test/MC/ELF/alias.s
index 0ab6dd4b5b8..78df7371d25 100644
--- a/llvm/test/MC/ELF/alias.s
+++ b/llvm/test/MC/ELF/alias.s
@@ -24,15 +24,6 @@ bar5 = bar4
bar6 = bar5
bar6:
-// Test that indirect local aliases do not appear as symbols.
-.data
-.Llocal:
-
-.text
-leaq .Llocal1(%rip), %rdi
-.Llocal1 = .Llocal2
-.Llocal2 = .Llocal
-
// CHECK: Symbols [
// CHECK-NEXT: Symbol {
// CHECK-NEXT: Name: (0)
diff --git a/llvm/test/MC/MachO/ARM/aliased-symbols.s b/llvm/test/MC/MachO/ARM/aliased-symbols.s
index cc2e200ce8a..e87b81c6a15 100644
--- a/llvm/test/MC/MachO/ARM/aliased-symbols.s
+++ b/llvm/test/MC/MachO/ARM/aliased-symbols.s
@@ -45,9 +45,9 @@ Ltmp0:
// CHECK-NEXT: Value: 0x[[DEFINED_EARLY]]
// CHECK-NEXT: }
- // alias_to_late was an alias to defined_late. But we can resolve it.
+ // defined_late was defined. Just after defined_early.
// CHECK: Symbol {
-// CHECK-NEXT: Name: alias_to_late
+// CHECK-NEXT: Name: defined_late
// CHECK-NEXT: Type: Section (0xE)
// CHECK-NEXT: Section: __data (0x2)
// CHECK-NEXT: RefType: UndefinedNonLazy (0x0)
@@ -56,9 +56,9 @@ Ltmp0:
// CHECK-NEXT: Value: 0x[[DEFINED_LATE:[0-9A-F]+]]
// CHECK-NEXT: }
- // defined_late was defined. Just after defined_early.
+ // alias_to_late was an alias to defined_late. But we can resolve it.
// CHECK: Symbol {
-// CHECK-NEXT: Name: defined_late
+// CHECK-NEXT: Name: alias_to_late
// CHECK-NEXT: Type: Section (0xE)
// CHECK-NEXT: Section: __data (0x2)
// CHECK-NEXT: RefType: UndefinedNonLazy (0x0)
@@ -72,7 +72,7 @@ Ltmp0:
// CHECK: Symbol {
// CHECK-NEXT: Name: alias_to_local (42)
// CHECK-NEXT: Type: Section (0xE)
-// CHECK-NEXT: Section: __data (0x2)
+// CHECK-NEXT: Section: (0x0)
// CHECK-NEXT: RefType: UndefinedNonLazy (0x0)
// CHECK-NEXT: Flags [ (0x0)
// CHECK-NEXT: ]
OpenPOWER on IntegriCloud