mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
Use printable names to implement directional labels.
This changes the implementation of local directional labels to use a dedicated map. With that it can then just use CreateTempSymbol, which is what the rest of MC uses. CreateTempSymbol doesn't do a great job at making sure the names are unique (or being efficient when the names are not needed), but that should probably be fixed in a followup patch. This fixes pr18928. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203826 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1fa9a14308
commit
7e9df19d5f
@ -70,6 +70,14 @@ namespace llvm {
|
||||
/// Symbols - Bindings of names to symbols.
|
||||
SymbolTable Symbols;
|
||||
|
||||
/// A maping from a local label number and an instance count to a symbol.
|
||||
/// For example, in the assembly
|
||||
/// 1:
|
||||
/// 2:
|
||||
/// 1:
|
||||
/// We have three labels represented by the pairs (1, 0), (2, 0) and (1, 1)
|
||||
DenseMap<std::pair<unsigned, unsigned>, MCSymbol*> LocalSymbols;
|
||||
|
||||
/// UsedNames - Keeps tracks of names that were used both for used declared
|
||||
/// and artificial symbols.
|
||||
StringMap<bool, BumpPtrAllocator&> UsedNames;
|
||||
@ -82,10 +90,10 @@ namespace llvm {
|
||||
DenseMap<unsigned, MCLabel *> Instances;
|
||||
/// NextInstance() creates the next instance of the directional local label
|
||||
/// for the LocalLabelVal and adds it to the map if needed.
|
||||
unsigned NextInstance(int64_t LocalLabelVal);
|
||||
unsigned NextInstance(unsigned LocalLabelVal);
|
||||
/// GetInstance() gets the current instance of the directional local label
|
||||
/// for the LocalLabelVal and adds it to the map if needed.
|
||||
unsigned GetInstance(int64_t LocalLabelVal);
|
||||
unsigned GetInstance(unsigned LocalLabelVal);
|
||||
|
||||
/// The file name of the log file from the environment variable
|
||||
/// AS_SECURE_LOG_FILE. Which must be set before the .secure_log_unique
|
||||
@ -154,6 +162,9 @@ namespace llvm {
|
||||
|
||||
MCSymbol *CreateSymbol(StringRef Name);
|
||||
|
||||
MCSymbol *getOrCreateDirectionalLocalSymbol(unsigned LocalLabelVal,
|
||||
unsigned Instance);
|
||||
|
||||
public:
|
||||
explicit MCContext(const MCAsmInfo *MAI, const MCRegisterInfo *MRI,
|
||||
const MCObjectFileInfo *MOFI, const SourceMgr *Mgr = 0,
|
||||
@ -190,13 +201,13 @@ namespace llvm {
|
||||
/// symbol names.
|
||||
unsigned getUniqueSymbolID() { return NextUniqueID++; }
|
||||
|
||||
/// CreateDirectionalLocalSymbol - Create the definition of a directional
|
||||
/// local symbol for numbered label (used for "1:" definitions).
|
||||
MCSymbol *CreateDirectionalLocalSymbol(int64_t LocalLabelVal);
|
||||
/// Create the definition of a directional local symbol for numbered label
|
||||
/// (used for "1:" definitions).
|
||||
MCSymbol *CreateDirectionalLocalSymbol(unsigned LocalLabelVal);
|
||||
|
||||
/// GetDirectionalLocalSymbol - Create and return a directional local
|
||||
/// symbol for numbered label (used for "1b" or 1f" references).
|
||||
MCSymbol *GetDirectionalLocalSymbol(int64_t LocalLabelVal, int bORf);
|
||||
/// Create and return a directional local symbol for numbered label (used
|
||||
/// for "1b" or 1f" references).
|
||||
MCSymbol *GetDirectionalLocalSymbol(unsigned LocalLabelVal, bool Before);
|
||||
|
||||
/// GetOrCreateSymbol - Lookup the symbol inside with the specified
|
||||
/// @p Name. If it exists, return it. If not, create a forward
|
||||
|
@ -162,32 +162,39 @@ MCSymbol *MCContext::CreateTempSymbol() {
|
||||
return CreateSymbol(NameSV);
|
||||
}
|
||||
|
||||
unsigned MCContext::NextInstance(int64_t LocalLabelVal) {
|
||||
unsigned MCContext::NextInstance(unsigned LocalLabelVal) {
|
||||
MCLabel *&Label = Instances[LocalLabelVal];
|
||||
if (!Label)
|
||||
Label = new (*this) MCLabel(0);
|
||||
return Label->incInstance();
|
||||
}
|
||||
|
||||
unsigned MCContext::GetInstance(int64_t LocalLabelVal) {
|
||||
unsigned MCContext::GetInstance(unsigned LocalLabelVal) {
|
||||
MCLabel *&Label = Instances[LocalLabelVal];
|
||||
if (!Label)
|
||||
Label = new (*this) MCLabel(0);
|
||||
return Label->getInstance();
|
||||
}
|
||||
|
||||
MCSymbol *MCContext::CreateDirectionalLocalSymbol(int64_t LocalLabelVal) {
|
||||
return GetOrCreateSymbol(Twine(MAI->getPrivateGlobalPrefix()) +
|
||||
Twine(LocalLabelVal) +
|
||||
"\2" +
|
||||
Twine(NextInstance(LocalLabelVal)));
|
||||
MCSymbol *MCContext::getOrCreateDirectionalLocalSymbol(unsigned LocalLabelVal,
|
||||
unsigned Instance) {
|
||||
MCSymbol *&Sym = LocalSymbols[std::make_pair(LocalLabelVal, Instance)];
|
||||
if (!Sym)
|
||||
Sym = CreateTempSymbol();
|
||||
return Sym;
|
||||
}
|
||||
MCSymbol *MCContext::GetDirectionalLocalSymbol(int64_t LocalLabelVal,
|
||||
int bORf) {
|
||||
return GetOrCreateSymbol(Twine(MAI->getPrivateGlobalPrefix()) +
|
||||
Twine(LocalLabelVal) +
|
||||
"\2" +
|
||||
Twine(GetInstance(LocalLabelVal) + bORf));
|
||||
|
||||
MCSymbol *MCContext::CreateDirectionalLocalSymbol(unsigned LocalLabelVal) {
|
||||
unsigned Instance = NextInstance(LocalLabelVal);
|
||||
return getOrCreateDirectionalLocalSymbol(LocalLabelVal, Instance);
|
||||
}
|
||||
|
||||
MCSymbol *MCContext::GetDirectionalLocalSymbol(unsigned LocalLabelVal,
|
||||
bool Before) {
|
||||
unsigned Instance = GetInstance(LocalLabelVal);
|
||||
if (!Before)
|
||||
++Instance;
|
||||
return getOrCreateDirectionalLocalSymbol(LocalLabelVal, Instance);
|
||||
}
|
||||
|
||||
MCSymbol *MCContext::LookupSymbol(StringRef Name) const {
|
||||
|
@ -884,7 +884,7 @@ bool AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
|
||||
}
|
||||
if (IDVal == "f" || IDVal == "b") {
|
||||
MCSymbol *Sym =
|
||||
Ctx.GetDirectionalLocalSymbol(IntVal, IDVal == "f" ? 1 : 0);
|
||||
Ctx.GetDirectionalLocalSymbol(IntVal, IDVal == "b");
|
||||
Res = MCSymbolRefExpr::Create(Sym, Variant, getContext());
|
||||
if (IDVal == "b" && Sym->isUndefined())
|
||||
return Error(Loc, "invalid reference to undefined symbol");
|
||||
|
@ -1105,8 +1105,7 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
|
||||
StringRef IDVal = getTok().getString();
|
||||
if (IDVal == "f" || IDVal == "b") {
|
||||
MCSymbol *Sym =
|
||||
getContext().GetDirectionalLocalSymbol(IntVal,
|
||||
IDVal == "f" ? 1 : 0);
|
||||
getContext().GetDirectionalLocalSymbol(IntVal, IDVal == "b");
|
||||
MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
|
||||
const MCExpr *Val =
|
||||
MCSymbolRefExpr::Create(Sym, Variant, getContext());
|
||||
|
@ -8,9 +8,10 @@ FUNCTION_NAME:
|
||||
.intel_syntax
|
||||
cmp rdi, 1
|
||||
jge 1f
|
||||
// CHECK: jge "L11"
|
||||
// CHECK: jge Ltmp0
|
||||
add rdi, 2
|
||||
// CHECK: addq $2, %rdi
|
||||
1:
|
||||
// CHECK: "L11":
|
||||
// CHECK: Ltmp0:
|
||||
add rdi, 1
|
||||
ret
|
||||
|
Loading…
Reference in New Issue
Block a user