[llvm] 5acdd8d - AVR: Rename AVRMCExpr::VK_ to AVR::S_
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 16 09:16:04 PDT 2025
Author: Fangrui Song
Date: 2025-06-16T09:15:59-07:00
New Revision: 5acdd8d0cf785595b06c1a28326b560f720b4f16
URL: https://github.com/llvm/llvm-project/commit/5acdd8d0cf785595b06c1a28326b560f720b4f16
DIFF: https://github.com/llvm/llvm-project/commit/5acdd8d0cf785595b06c1a28326b560f720b4f16.diff
LOG: AVR: Rename AVRMCExpr::VK_ to AVR::S_
Prepare for removing AVRMCExpr. Adopt the new naming convention (S_
instead of VK_; the relocation specifier was previously named
`VariantKind`)) used by most other targets.
Make AVRMCAsmInfo.h include AVRMCExpr.h and change .cpp files to include
AVRMCAsmInfo.h. We will eventually remove AVRMCExpr.h.
Added:
Modified:
llvm/lib/Target/AVR/AVRAsmPrinter.cpp
llvm/lib/Target/AVR/AVRMCInstLower.cpp
llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp
llvm/lib/Target/AVR/MCTargetDesc/AVRELFObjectWriter.cpp
llvm/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.cpp
llvm/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.h
llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp
llvm/lib/Target/AVR/MCTargetDesc/AVRMCELFStreamer.cpp
llvm/lib/Target/AVR/MCTargetDesc/AVRMCELFStreamer.h
llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp
llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.h
Removed:
################################################################################
diff --git a/llvm/lib/Target/AVR/AVRAsmPrinter.cpp b/llvm/lib/Target/AVR/AVRAsmPrinter.cpp
index ed537f8cc7178..1a1e5155979e6 100644
--- a/llvm/lib/Target/AVR/AVRAsmPrinter.cpp
+++ b/llvm/lib/Target/AVR/AVRAsmPrinter.cpp
@@ -16,7 +16,7 @@
#include "AVRSubtarget.h"
#include "AVRTargetMachine.h"
#include "MCTargetDesc/AVRInstPrinter.h"
-#include "MCTargetDesc/AVRMCExpr.h"
+#include "MCTargetDesc/AVRMCAsmInfo.h"
#include "TargetInfo/AVRTargetInfo.h"
#include "llvm/CodeGen/AsmPrinter.h"
@@ -215,7 +215,7 @@ const MCExpr *AVRAsmPrinter::lowerConstant(const Constant *CV,
bool IsProgMem = GV->getAddressSpace() == AVR::ProgramMemory;
if (IsProgMem) {
const MCExpr *Expr = MCSymbolRefExpr::create(getSymbol(GV), Ctx);
- return AVRMCExpr::create(AVRMCExpr::VK_PM, Expr, false, Ctx);
+ return AVRMCExpr::create(AVR::S_PM, Expr, false, Ctx);
}
}
diff --git a/llvm/lib/Target/AVR/AVRMCInstLower.cpp b/llvm/lib/Target/AVR/AVRMCInstLower.cpp
index 47d9073f6eb84..f4bddfdac3461 100644
--- a/llvm/lib/Target/AVR/AVRMCInstLower.cpp
+++ b/llvm/lib/Target/AVR/AVRMCInstLower.cpp
@@ -13,7 +13,7 @@
#include "AVRMCInstLower.h"
#include "AVRInstrInfo.h"
-#include "MCTargetDesc/AVRMCExpr.h"
+#include "MCTargetDesc/AVRMCAsmInfo.h"
#include "llvm/CodeGen/AsmPrinter.h"
#include "llvm/IR/Mangler.h"
@@ -42,19 +42,19 @@ AVRMCInstLower::lowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym,
if (TF & AVRII::MO_LO) {
if (IsFunction) {
- Expr = AVRMCExpr::create(Subtarget.hasEIJMPCALL() ? AVRMCExpr::VK_LO8_GS
- : AVRMCExpr::VK_PM_LO8,
+ Expr = AVRMCExpr::create(Subtarget.hasEIJMPCALL() ? AVR::S_LO8_GS
+ : AVR::S_PM_LO8,
Expr, IsNegated, Ctx);
} else {
- Expr = AVRMCExpr::create(AVRMCExpr::VK_LO8, Expr, IsNegated, Ctx);
+ Expr = AVRMCExpr::create(AVR::S_LO8, Expr, IsNegated, Ctx);
}
} else if (TF & AVRII::MO_HI) {
if (IsFunction) {
- Expr = AVRMCExpr::create(Subtarget.hasEIJMPCALL() ? AVRMCExpr::VK_HI8_GS
- : AVRMCExpr::VK_PM_HI8,
+ Expr = AVRMCExpr::create(Subtarget.hasEIJMPCALL() ? AVR::S_HI8_GS
+ : AVR::S_PM_HI8,
Expr, IsNegated, Ctx);
} else {
- Expr = AVRMCExpr::create(AVRMCExpr::VK_HI8, Expr, IsNegated, Ctx);
+ Expr = AVRMCExpr::create(AVR::S_HI8, Expr, IsNegated, Ctx);
}
} else if (TF != 0) {
llvm_unreachable("Unknown target flag on symbol operand");
diff --git a/llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp b/llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp
index cab5caffdcba8..e82bd761eeb39 100644
--- a/llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp
+++ b/llvm/lib/Target/AVR/AsmParser/AVRAsmParser.cpp
@@ -7,8 +7,8 @@
//===----------------------------------------------------------------------===//
#include "AVRRegisterInfo.h"
+#include "MCTargetDesc/AVRMCAsmInfo.h"
#include "MCTargetDesc/AVRMCELFStreamer.h"
-#include "MCTargetDesc/AVRMCExpr.h"
#include "MCTargetDesc/AVRMCTargetDesc.h"
#include "TargetInfo/AVRTargetInfo.h"
@@ -447,7 +447,7 @@ bool AVRAsmParser::tryParseExpression(OperandVector &Operands, int64_t offset) {
bool AVRAsmParser::tryParseRelocExpression(OperandVector &Operands) {
bool isNegated = false;
- AVRMCExpr::Specifier ModifierKind = AVRMCExpr::VK_AVR_NONE;
+ AVR::Specifier ModifierKind = AVR::S_AVR_NONE;
SMLoc S = Parser.getTok().getLoc();
@@ -473,14 +473,14 @@ bool AVRAsmParser::tryParseRelocExpression(OperandVector &Operands) {
StringRef ModifierName = Parser.getTok().getString();
ModifierKind = AVRMCExpr::parseSpecifier(ModifierName);
- if (ModifierKind != AVRMCExpr::VK_AVR_NONE) {
+ if (ModifierKind != AVR::S_AVR_NONE) {
Parser.Lex();
Parser.Lex(); // Eat modifier name and parenthesis
if (Parser.getTok().getString() == GENERATE_STUBS &&
Parser.getTok().getKind() == AsmToken::Identifier) {
std::string GSModName = ModifierName.str() + "_" + GENERATE_STUBS;
ModifierKind = AVRMCExpr::parseSpecifier(GSModName);
- if (ModifierKind != AVRMCExpr::VK_AVR_NONE)
+ if (ModifierKind != AVR::S_AVR_NONE)
Parser.Lex(); // Eat gs modifier name
}
} else {
@@ -698,15 +698,15 @@ ParseStatus AVRAsmParser::parseLiteralValues(unsigned SizeInBytes, SMLoc L) {
Tokens[1].getKind() == AsmToken::Identifier) {
MCSymbol *Symbol = getContext().getOrCreateSymbol(".text");
AVRStreamer.emitValueForModiferKind(Symbol, SizeInBytes, L,
- AVRMCExpr::VK_AVR_NONE);
+ AVR::S_AVR_NONE);
return ParseStatus::NoMatch;
}
if (Parser.getTok().getKind() == AsmToken::Identifier &&
Parser.getLexer().peekTok().getKind() == AsmToken::LParen) {
StringRef ModifierName = Parser.getTok().getString();
- AVRMCExpr::Specifier Spec = AVRMCExpr::parseSpecifier(ModifierName);
- if (Spec != AVRMCExpr::VK_AVR_NONE) {
+ AVR::Specifier Spec = AVRMCExpr::parseSpecifier(ModifierName);
+ if (Spec != AVR::S_AVR_NONE) {
Parser.Lex();
Parser.Lex(); // Eat the modifier and parenthesis
} else {
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRELFObjectWriter.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRELFObjectWriter.cpp
index e79ba29e0cbec..619efb376c613 100644
--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRELFObjectWriter.cpp
+++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRELFObjectWriter.cpp
@@ -7,7 +7,7 @@
//===----------------------------------------------------------------------===//
#include "MCTargetDesc/AVRFixupKinds.h"
-#include "MCTargetDesc/AVRMCExpr.h"
+#include "MCTargetDesc/AVRMCAsmInfo.h"
#include "MCTargetDesc/AVRMCTargetDesc.h"
#include "llvm/MC/MCAssembler.h"
@@ -36,42 +36,42 @@ AVRELFObjectWriter::AVRELFObjectWriter(uint8_t OSABI)
unsigned AVRELFObjectWriter::getRelocType(const MCFixup &Fixup,
const MCValue &Target,
bool IsPCRel) const {
- auto Modifier = AVRMCExpr::Specifier(Target.getSpecifier());
+ auto Spec = Target.getSpecifier();
switch ((unsigned)Fixup.getKind()) {
case FK_Data_1:
- switch (Modifier) {
+ switch (Spec) {
default:
llvm_unreachable("Unsupported Modifier");
- case AVRMCExpr::VK_None:
+ case AVR::S_None:
return ELF::R_AVR_8;
- case AVRMCExpr::VK_DIFF8:
+ case AVR::S_DIFF8:
return ELF::R_AVR_DIFF8;
- case AVRMCExpr::VK_LO8:
+ case AVR::S_LO8:
return ELF::R_AVR_8_LO8;
- case AVRMCExpr::VK_HI8:
+ case AVR::S_HI8:
return ELF::R_AVR_8_HI8;
- case AVRMCExpr::VK_HH8:
+ case AVR::S_HH8:
return ELF::R_AVR_8_HLO8;
}
case FK_Data_4:
- switch (Modifier) {
+ switch (Spec) {
default:
llvm_unreachable("Unsupported Modifier");
- case AVRMCExpr::VK_None:
+ case AVR::S_None:
return ELF::R_AVR_32;
- case AVRMCExpr::VK_DIFF32:
+ case AVR::S_DIFF32:
return ELF::R_AVR_DIFF32;
}
case FK_Data_2:
- switch (Modifier) {
+ switch (Spec) {
default:
llvm_unreachable("Unsupported Modifier");
- case AVRMCExpr::VK_None:
+ case AVR::S_None:
return ELF::R_AVR_16;
- case AVRMCExpr::VK_AVR_NONE:
- case AVRMCExpr::VK_PM:
+ case AVR::S_AVR_NONE:
+ case AVR::S_PM:
return ELF::R_AVR_16_PM;
- case AVRMCExpr::VK_DIFF16:
+ case AVR::S_DIFF16:
return ELF::R_AVR_DIFF16;
}
case AVR::fixup_32:
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.cpp
index d37e39c51e159..68db5227d073c 100644
--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.cpp
+++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.cpp
@@ -11,7 +11,10 @@
//===----------------------------------------------------------------------===//
#include "AVRMCAsmInfo.h"
+#include "llvm/MC/MCAssembler.h"
+#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCExpr.h"
+#include "llvm/MC/MCValue.h"
#include "llvm/TargetParser/Triple.h"
using namespace llvm;
@@ -26,3 +29,179 @@ AVRMCAsmInfo::AVRMCAsmInfo(const Triple &TT, const MCTargetOptions &Options) {
UsesELFSectionDirectiveForBSS = true;
SupportsDebugInformation = true;
}
+
+namespace {
+const struct ModifierEntry {
+ const char *const Spelling;
+ AVRMCExpr::Specifier specifier;
+} ModifierNames[] = {
+ {"lo8", AVR::S_LO8}, {"hi8", AVR::S_HI8},
+ {"hh8", AVR::S_HH8}, // synonym with hlo8
+ {"hlo8", AVR::S_HH8}, {"hhi8", AVR::S_HHI8},
+
+ {"pm", AVR::S_PM}, {"pm_lo8", AVR::S_PM_LO8},
+ {"pm_hi8", AVR::S_PM_HI8}, {"pm_hh8", AVR::S_PM_HH8},
+
+ {"lo8_gs", AVR::S_LO8_GS}, {"hi8_gs", AVR::S_HI8_GS},
+ {"gs", AVR::S_GS},
+};
+
+} // end of anonymous namespace
+
+AVRMCExpr::Specifier AVRMCExpr::parseSpecifier(StringRef Name) {
+ const auto &Modifier =
+ llvm::find_if(ModifierNames, [&Name](ModifierEntry const &Mod) {
+ return Mod.Spelling == Name;
+ });
+
+ if (Modifier != std::end(ModifierNames)) {
+ return Modifier->specifier;
+ }
+ return AVR::S_AVR_NONE;
+}
+
+const char *AVRMCExpr::getName() const {
+ const auto &Modifier =
+ llvm::find_if(ModifierNames, [this](ModifierEntry const &Mod) {
+ return Mod.specifier == specifier;
+ });
+
+ if (Modifier != std::end(ModifierNames)) {
+ return Modifier->Spelling;
+ }
+ return nullptr;
+}
+
+AVR::Fixups AVRMCExpr::getFixupKind() const {
+ AVR::Fixups Kind = AVR::Fixups::LastTargetFixupKind;
+
+ switch (specifier) {
+ case AVR::S_LO8:
+ Kind = isNegated() ? AVR::fixup_lo8_ldi_neg : AVR::fixup_lo8_ldi;
+ break;
+ case AVR::S_HI8:
+ Kind = isNegated() ? AVR::fixup_hi8_ldi_neg : AVR::fixup_hi8_ldi;
+ break;
+ case AVR::S_HH8:
+ Kind = isNegated() ? AVR::fixup_hh8_ldi_neg : AVR::fixup_hh8_ldi;
+ break;
+ case AVR::S_HHI8:
+ Kind = isNegated() ? AVR::fixup_ms8_ldi_neg : AVR::fixup_ms8_ldi;
+ break;
+
+ case AVR::S_PM_LO8:
+ Kind = isNegated() ? AVR::fixup_lo8_ldi_pm_neg : AVR::fixup_lo8_ldi_pm;
+ break;
+ case AVR::S_PM_HI8:
+ Kind = isNegated() ? AVR::fixup_hi8_ldi_pm_neg : AVR::fixup_hi8_ldi_pm;
+ break;
+ case AVR::S_PM_HH8:
+ Kind = isNegated() ? AVR::fixup_hh8_ldi_pm_neg : AVR::fixup_hh8_ldi_pm;
+ break;
+ case AVR::S_PM:
+ case AVR::S_GS:
+ Kind = AVR::fixup_16_pm;
+ break;
+ case AVR::S_LO8_GS:
+ Kind = AVR::fixup_lo8_ldi_gs;
+ break;
+ case AVR::S_HI8_GS:
+ Kind = AVR::fixup_hi8_ldi_gs;
+ break;
+
+ default:
+ llvm_unreachable("Uninitialized expression");
+ }
+
+ return Kind;
+}
+
+int64_t AVRMCExpr::evaluateAsInt64(int64_t Value) const {
+ if (Negated)
+ Value *= -1;
+
+ switch (specifier) {
+ case AVR::S_LO8:
+ Value &= 0xff;
+ break;
+ case AVR::S_HI8:
+ Value &= 0xff00;
+ Value >>= 8;
+ break;
+ case AVR::S_HH8:
+ Value &= 0xff0000;
+ Value >>= 16;
+ break;
+ case AVR::S_HHI8:
+ Value &= 0xff000000;
+ Value >>= 24;
+ break;
+ case AVR::S_PM_LO8:
+ case AVR::S_LO8_GS:
+ Value >>= 1; // Program memory addresses must always be shifted by one.
+ Value &= 0xff;
+ break;
+ case AVR::S_PM_HI8:
+ case AVR::S_HI8_GS:
+ Value >>= 1; // Program memory addresses must always be shifted by one.
+ Value &= 0xff00;
+ Value >>= 8;
+ break;
+ case AVR::S_PM_HH8:
+ Value >>= 1; // Program memory addresses must always be shifted by one.
+ Value &= 0xff0000;
+ Value >>= 16;
+ break;
+ case AVR::S_PM:
+ case AVR::S_GS:
+ Value >>= 1; // Program memory addresses must always be shifted by one.
+ break;
+
+ case AVR::S_AVR_NONE:
+ default:
+ llvm_unreachable("Uninitialized expression.");
+ }
+ return static_cast<uint64_t>(Value) & 0xff;
+}
+
+bool AVRMCExpr::evaluateAsRelocatableImpl(MCValue &Result,
+ const MCAssembler *Asm) const {
+ MCValue Value;
+ bool isRelocatable = getSubExpr()->evaluateAsRelocatable(Value, Asm);
+ if (!isRelocatable)
+ return false;
+
+ if (Value.isAbsolute()) {
+ Result = MCValue::get(evaluateAsInt64(Value.getConstant()));
+ } else {
+ if (!Asm || !Asm->hasLayout())
+ return false;
+
+ auto Spec = AVR::S_None;
+ if (Value.getSpecifier() != MCSymbolRefExpr::VK_None)
+ return false;
+ assert(!Value.getSubSym());
+ if (specifier == AVR::S_PM)
+ Spec = AVR::S_PM;
+
+ // TODO: don't attach specifier to MCSymbolRefExpr.
+ Result =
+ MCValue::get(Value.getAddSym(), nullptr, Value.getConstant(), Spec);
+ }
+
+ return true;
+}
+
+bool AVRMCExpr::evaluateAsConstant(int64_t &Result) const {
+ MCValue Value;
+ bool isRelocatable = getSubExpr()->evaluateAsRelocatable(Value, nullptr);
+ if (!isRelocatable)
+ return false;
+
+ if (Value.isAbsolute()) {
+ Result = evaluateAsInt64(Value.getConstant());
+ return true;
+ }
+
+ return false;
+}
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.h b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.h
index 17dd77f6266a1..649e247adab0f 100644
--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.h
+++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.h
@@ -13,7 +13,9 @@
#ifndef LLVM_AVR_ASM_INFO_H
#define LLVM_AVR_ASM_INFO_H
+#include "MCTargetDesc/AVRMCExpr.h"
#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCExpr.h"
namespace llvm {
@@ -25,6 +27,33 @@ class AVRMCAsmInfo : public MCAsmInfo {
explicit AVRMCAsmInfo(const Triple &TT, const MCTargetOptions &Options);
};
+namespace AVR {
+using Specifier = uint16_t;
+enum {
+ S_None,
+
+ S_AVR_NONE = MCSymbolRefExpr::FirstTargetSpecifier,
+
+ S_HI8, ///< Corresponds to `hi8()`.
+ S_LO8, ///< Corresponds to `lo8()`.
+ S_HH8, ///< Corresponds to `hlo8() and hh8()`.
+ S_HHI8, ///< Corresponds to `hhi8()`.
+
+ S_PM, ///< Corresponds to `pm()`, reference to program memory.
+ S_PM_LO8, ///< Corresponds to `pm_lo8()`.
+ S_PM_HI8, ///< Corresponds to `pm_hi8()`.
+ S_PM_HH8, ///< Corresponds to `pm_hh8()`.
+
+ S_LO8_GS, ///< Corresponds to `lo8(gs())`.
+ S_HI8_GS, ///< Corresponds to `hi8(gs())`.
+ S_GS, ///< Corresponds to `gs()`.
+
+ S_DIFF8,
+ S_DIFF16,
+ S_DIFF32,
+};
+} // namespace AVR
+
} // end namespace llvm
#endif // LLVM_AVR_ASM_INFO_H
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp
index fa01dad5ec128..4934e1c71bc03 100644
--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp
+++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCCodeEmitter.cpp
@@ -12,7 +12,7 @@
#include "AVRMCCodeEmitter.h"
-#include "MCTargetDesc/AVRMCExpr.h"
+#include "MCTargetDesc/AVRMCAsmInfo.h"
#include "MCTargetDesc/AVRMCTargetDesc.h"
#include "llvm/ADT/APFloat.h"
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCELFStreamer.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCELFStreamer.cpp
index 88393fb9928a4..0644f422b328e 100644
--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCELFStreamer.cpp
+++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCELFStreamer.cpp
@@ -23,19 +23,19 @@ using namespace llvm;
void AVRMCELFStreamer::emitValueForModiferKind(
const MCSymbol *Sym, unsigned SizeInBytes, SMLoc Loc,
AVRMCExpr::Specifier ModifierKind) {
- AVRMCExpr::Specifier Kind = AVRMCExpr::VK_AVR_NONE;
- if (ModifierKind == AVRMCExpr::VK_AVR_NONE) {
- Kind = AVRMCExpr::VK_DIFF8;
+ AVRMCExpr::Specifier Kind = AVR::S_AVR_NONE;
+ if (ModifierKind == AVR::S_AVR_NONE) {
+ Kind = AVR::S_DIFF8;
if (SizeInBytes == SIZE_LONG)
- Kind = AVRMCExpr::VK_DIFF32;
+ Kind = AVR::S_DIFF32;
else if (SizeInBytes == SIZE_WORD)
- Kind = AVRMCExpr::VK_DIFF16;
- } else if (ModifierKind == AVRMCExpr::VK_LO8)
- Kind = AVRMCExpr::VK_LO8;
- else if (ModifierKind == AVRMCExpr::VK_HI8)
- Kind = AVRMCExpr::VK_HI8;
- else if (ModifierKind == AVRMCExpr::VK_HH8)
- Kind = AVRMCExpr::VK_HH8;
+ Kind = AVR::S_DIFF16;
+ } else if (ModifierKind == AVR::S_LO8)
+ Kind = AVR::S_LO8;
+ else if (ModifierKind == AVR::S_HI8)
+ Kind = AVR::S_HI8;
+ else if (ModifierKind == AVR::S_HH8)
+ Kind = AVR::S_HH8;
MCELFStreamer::emitValue(
MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VariantKind(Kind),
getContext()),
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCELFStreamer.h b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCELFStreamer.h
index 2d45de083583c..88352337524ad 100644
--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCELFStreamer.h
+++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCELFStreamer.h
@@ -9,7 +9,7 @@
#ifndef LLVM_LIB_TARGET_AVR_MCTARGETDESC_AVRMCELFSTREAMER_H
#define LLVM_LIB_TARGET_AVR_MCTARGETDESC_AVRMCELFSTREAMER_H
-#include "MCTargetDesc/AVRMCExpr.h"
+#include "MCTargetDesc/AVRMCAsmInfo.h"
#include "MCTargetDesc/AVRMCTargetDesc.h"
#include "llvm/MC/MCAsmBackend.h"
#include "llvm/MC/MCCodeEmitter.h"
@@ -41,9 +41,10 @@ class AVRMCELFStreamer : public MCELFStreamer {
std::move(Emitter)),
MCII(createAVRMCInstrInfo()) {}
- void emitValueForModiferKind(
- const MCSymbol *Sym, unsigned SizeInBytes, SMLoc Loc = SMLoc(),
- AVRMCExpr::Specifier ModifierKind = AVRMCExpr::VK_AVR_NONE);
+ void
+ emitValueForModiferKind(const MCSymbol *Sym, unsigned SizeInBytes,
+ SMLoc Loc = SMLoc(),
+ AVRMCExpr::Specifier ModifierKind = AVR::S_AVR_NONE);
};
MCStreamer *createAVRELFStreamer(Triple const &TT, MCContext &Context,
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp
index 5be799093d2c1..3067e854d8dc8 100644
--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp
+++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.cpp
@@ -7,41 +7,22 @@
//===----------------------------------------------------------------------===//
#include "AVRMCExpr.h"
+#include "MCTargetDesc/AVRMCAsmInfo.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCContext.h"
-#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCValue.h"
namespace llvm {
-namespace {
-
-const struct ModifierEntry {
- const char *const Spelling;
- AVRMCExpr::Specifier specifier;
-} ModifierNames[] = {
- {"lo8", AVRMCExpr::VK_LO8}, {"hi8", AVRMCExpr::VK_HI8},
- {"hh8", AVRMCExpr::VK_HH8}, // synonym with hlo8
- {"hlo8", AVRMCExpr::VK_HH8}, {"hhi8", AVRMCExpr::VK_HHI8},
-
- {"pm", AVRMCExpr::VK_PM}, {"pm_lo8", AVRMCExpr::VK_PM_LO8},
- {"pm_hi8", AVRMCExpr::VK_PM_HI8}, {"pm_hh8", AVRMCExpr::VK_PM_HH8},
-
- {"lo8_gs", AVRMCExpr::VK_LO8_GS}, {"hi8_gs", AVRMCExpr::VK_HI8_GS},
- {"gs", AVRMCExpr::VK_GS},
-};
-
-} // end of anonymous namespace
-
const AVRMCExpr *AVRMCExpr::create(Specifier Kind, const MCExpr *Expr,
bool Negated, MCContext &Ctx) {
return new (Ctx) AVRMCExpr(Kind, Expr, Negated);
}
void AVRMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
- assert(specifier != VK_AVR_NONE);
+ assert(specifier != AVR::S_AVR_NONE);
OS << getName() << '(';
if (isNegated())
OS << '-' << '(';
@@ -51,164 +32,4 @@ void AVRMCExpr::printImpl(raw_ostream &OS, const MCAsmInfo *MAI) const {
OS << ')';
}
-bool AVRMCExpr::evaluateAsConstant(int64_t &Result) const {
- MCValue Value;
-
- bool isRelocatable = getSubExpr()->evaluateAsRelocatable(Value, nullptr);
-
- if (!isRelocatable)
- return false;
-
- if (Value.isAbsolute()) {
- Result = evaluateAsInt64(Value.getConstant());
- return true;
- }
-
- return false;
-}
-
-bool AVRMCExpr::evaluateAsRelocatableImpl(MCValue &Result,
- const MCAssembler *Asm) const {
- MCValue Value;
- bool isRelocatable = getSubExpr()->evaluateAsRelocatable(Value, Asm);
- if (!isRelocatable)
- return false;
-
- if (Value.isAbsolute()) {
- Result = MCValue::get(evaluateAsInt64(Value.getConstant()));
- } else {
- if (!Asm || !Asm->hasLayout())
- return false;
-
- auto Spec = AVRMCExpr::VK_None;
- if (Value.getSpecifier() != MCSymbolRefExpr::VK_None)
- return false;
- assert(!Value.getSubSym());
- if (specifier == VK_PM)
- Spec = AVRMCExpr::VK_PM;
-
- // TODO: don't attach specifier to MCSymbolRefExpr.
- Result =
- MCValue::get(Value.getAddSym(), nullptr, Value.getConstant(), Spec);
- }
-
- return true;
-}
-
-int64_t AVRMCExpr::evaluateAsInt64(int64_t Value) const {
- if (Negated)
- Value *= -1;
-
- switch (specifier) {
- case AVRMCExpr::VK_LO8:
- Value &= 0xff;
- break;
- case AVRMCExpr::VK_HI8:
- Value &= 0xff00;
- Value >>= 8;
- break;
- case AVRMCExpr::VK_HH8:
- Value &= 0xff0000;
- Value >>= 16;
- break;
- case AVRMCExpr::VK_HHI8:
- Value &= 0xff000000;
- Value >>= 24;
- break;
- case AVRMCExpr::VK_PM_LO8:
- case AVRMCExpr::VK_LO8_GS:
- Value >>= 1; // Program memory addresses must always be shifted by one.
- Value &= 0xff;
- break;
- case AVRMCExpr::VK_PM_HI8:
- case AVRMCExpr::VK_HI8_GS:
- Value >>= 1; // Program memory addresses must always be shifted by one.
- Value &= 0xff00;
- Value >>= 8;
- break;
- case AVRMCExpr::VK_PM_HH8:
- Value >>= 1; // Program memory addresses must always be shifted by one.
- Value &= 0xff0000;
- Value >>= 16;
- break;
- case AVRMCExpr::VK_PM:
- case AVRMCExpr::VK_GS:
- Value >>= 1; // Program memory addresses must always be shifted by one.
- break;
-
- case AVRMCExpr::VK_AVR_NONE:
- default:
- llvm_unreachable("Uninitialized expression.");
- }
- return static_cast<uint64_t>(Value) & 0xff;
-}
-
-AVR::Fixups AVRMCExpr::getFixupKind() const {
- AVR::Fixups Kind = AVR::Fixups::LastTargetFixupKind;
-
- switch (specifier) {
- case VK_LO8:
- Kind = isNegated() ? AVR::fixup_lo8_ldi_neg : AVR::fixup_lo8_ldi;
- break;
- case VK_HI8:
- Kind = isNegated() ? AVR::fixup_hi8_ldi_neg : AVR::fixup_hi8_ldi;
- break;
- case VK_HH8:
- Kind = isNegated() ? AVR::fixup_hh8_ldi_neg : AVR::fixup_hh8_ldi;
- break;
- case VK_HHI8:
- Kind = isNegated() ? AVR::fixup_ms8_ldi_neg : AVR::fixup_ms8_ldi;
- break;
-
- case VK_PM_LO8:
- Kind = isNegated() ? AVR::fixup_lo8_ldi_pm_neg : AVR::fixup_lo8_ldi_pm;
- break;
- case VK_PM_HI8:
- Kind = isNegated() ? AVR::fixup_hi8_ldi_pm_neg : AVR::fixup_hi8_ldi_pm;
- break;
- case VK_PM_HH8:
- Kind = isNegated() ? AVR::fixup_hh8_ldi_pm_neg : AVR::fixup_hh8_ldi_pm;
- break;
- case VK_PM:
- case VK_GS:
- Kind = AVR::fixup_16_pm;
- break;
- case VK_LO8_GS:
- Kind = AVR::fixup_lo8_ldi_gs;
- break;
- case VK_HI8_GS:
- Kind = AVR::fixup_hi8_ldi_gs;
- break;
-
- default:
- llvm_unreachable("Uninitialized expression");
- }
-
- return Kind;
-}
-
-const char *AVRMCExpr::getName() const {
- const auto &Modifier =
- llvm::find_if(ModifierNames, [this](ModifierEntry const &Mod) {
- return Mod.specifier == specifier;
- });
-
- if (Modifier != std::end(ModifierNames)) {
- return Modifier->Spelling;
- }
- return nullptr;
-}
-
-AVRMCExpr::Specifier AVRMCExpr::parseSpecifier(StringRef Name) {
- const auto &Modifier =
- llvm::find_if(ModifierNames, [&Name](ModifierEntry const &Mod) {
- return Mod.Spelling == Name;
- });
-
- if (Modifier != std::end(ModifierNames)) {
- return Modifier->specifier;
- }
- return VK_AVR_NONE;
-}
-
-} // end of namespace llvm
+} // namespace llvm
diff --git a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.h b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.h
index 69c60cde1f746..d72d36f108580 100644
--- a/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.h
+++ b/llvm/lib/Target/AVR/MCTargetDesc/AVRMCExpr.h
@@ -20,29 +20,6 @@ class AVRMCExpr : public MCSpecifierExpr {
public:
using Specifier = Spec;
/// Specifies the type of an expression.
- enum {
- VK_None,
-
- VK_AVR_NONE = MCSymbolRefExpr::FirstTargetSpecifier,
-
- VK_HI8, ///< Corresponds to `hi8()`.
- VK_LO8, ///< Corresponds to `lo8()`.
- VK_HH8, ///< Corresponds to `hlo8() and hh8()`.
- VK_HHI8, ///< Corresponds to `hhi8()`.
-
- VK_PM, ///< Corresponds to `pm()`, reference to program memory.
- VK_PM_LO8, ///< Corresponds to `pm_lo8()`.
- VK_PM_HI8, ///< Corresponds to `pm_hi8()`.
- VK_PM_HH8, ///< Corresponds to `pm_hh8()`.
-
- VK_LO8_GS, ///< Corresponds to `lo8(gs())`.
- VK_HI8_GS, ///< Corresponds to `hi8(gs())`.
- VK_GS, ///< Corresponds to `gs()`.
-
- VK_DIFF8,
- VK_DIFF16,
- VK_DIFF32,
- };
public:
/// Creates an AVR machine code expression.
More information about the llvm-commits
mailing list