mirror of
https://github.com/opnsense/src.git
synced 2026-03-17 16:14:58 -04:00
Don't treat .symver as a regular alias definition. This patch starts simplifying the handling of .symver. For now it just moves the responsibility for creating an alias down to the streamer. With that the asm streamer can pass a .symver unchanged, which is nice since gas cannot parse "foo@bar = zed". In a followup I hope to move the handling down to the writer so that we don't need special hacks for avoiding breaking names with @@@ on windows. Pull in r327160 from upstream llvm trunk (by Rafael Espindola): Delay creating an alias for @@@. With this we only create an alias for @@@ once we know if it should use @ or @@. This avoids last minutes renames and hacks to handle MS names. This only handles the ELF writer. LTO still has issues with @@@ aliases. Pull in r327928 from upstream llvm trunk (by Vitaly Buka): Object: Move attribute calculation into RecordStreamer. NFC Summary: Preparation for D44274 Reviewers: pcc, espindola Subscribers: hiraditya Differential Revision: https://reviews.llvm.org/D44276 Pull in r327930 from upstream llvm trunk (by Vitaly Buka): Object: Fix handling of @@@ in .symver directive Summary: name@@@nodename is going to be replaced with name@@nodename if symbols is defined in the assembled file, or name@nodename if undefined. https://sourceware.org/binutils/docs/as/Symver.html Fixes PR36623 Reviewers: pcc, espindola Subscribers: mehdi_amini, hiraditya Differential Revision: https://reviews.llvm.org/D44274 Together, these changes fix handling of @@@ in .symver directives when doing Link Time Optimization. Reported by: Shawn Webb <shawn.webb@hardenedbsd.org> MFC after: 3 months X-MFC-With: r327952
73 lines
2.5 KiB
C++
73 lines
2.5 KiB
C++
//===- RecordStreamer.h - Record asm defined and used symbols ---*- 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_OBJECT_RECORDSTREAMER_H
|
|
#define LLVM_LIB_OBJECT_RECORDSTREAMER_H
|
|
|
|
#include "llvm/ADT/DenseMap.h"
|
|
#include "llvm/ADT/StringMap.h"
|
|
#include "llvm/MC/MCDirectives.h"
|
|
#include "llvm/MC/MCStreamer.h"
|
|
#include "llvm/MC/MCSymbol.h"
|
|
#include "llvm/Support/SMLoc.h"
|
|
#include <vector>
|
|
|
|
namespace llvm {
|
|
|
|
class GlobalValue;
|
|
class Module;
|
|
|
|
class RecordStreamer : public MCStreamer {
|
|
public:
|
|
enum State { NeverSeen, Global, Defined, DefinedGlobal, DefinedWeak, Used,
|
|
UndefinedWeak};
|
|
|
|
private:
|
|
const Module &M;
|
|
StringMap<State> Symbols;
|
|
// Map of aliases created by .symver directives, saved so we can update
|
|
// their symbol binding after parsing complete. This maps from each
|
|
// aliasee to its list of aliases.
|
|
DenseMap<const MCSymbol *, std::vector<StringRef>> SymverAliasMap;
|
|
|
|
/// Get the state recorded for the given symbol.
|
|
State getSymbolState(const MCSymbol *Sym);
|
|
|
|
void markDefined(const MCSymbol &Symbol);
|
|
void markGlobal(const MCSymbol &Symbol, MCSymbolAttr Attribute);
|
|
void markUsed(const MCSymbol &Symbol);
|
|
void visitUsedSymbol(const MCSymbol &Sym) override;
|
|
|
|
public:
|
|
RecordStreamer(MCContext &Context, const Module &M);
|
|
|
|
using const_iterator = StringMap<State>::const_iterator;
|
|
|
|
const_iterator begin();
|
|
const_iterator end();
|
|
void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI,
|
|
bool) override;
|
|
void EmitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
|
|
void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
|
|
bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
|
|
void EmitZerofill(MCSection *Section, MCSymbol *Symbol, uint64_t Size,
|
|
unsigned ByteAlignment) override;
|
|
void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
|
unsigned ByteAlignment) override;
|
|
/// Record .symver aliases for later processing.
|
|
void emitELFSymverDirective(StringRef AliasName,
|
|
const MCSymbol *Aliasee) override;
|
|
// Emit ELF .symver aliases and ensure they have the same binding as the
|
|
// defined symbol they alias with.
|
|
void flushSymverDirectives();
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_LIB_OBJECT_RECORDSTREAMER_H
|