mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Hack the hack. If we have a situation where an ASM object is defined but isn't
reflected in the LLVM IR (as a declare or something), then treat it like a data object. N.B. This isn't 100% correct. The ASM parser should supply more information so that we know what type of object it is, and what attributes it should have. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153870 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
94338594ef
commit
8ba9405c5c
@ -400,14 +400,23 @@ void LTOModule::addAsmGlobalSymbol(const char *name,
|
||||
NameAndAttributes &info = _undefines[entry.getKey().data()];
|
||||
|
||||
if (info.symbol == 0) {
|
||||
// If we haven't seen this symbol before, save it and we may see it again.
|
||||
StringMap<NameAndAttributes>::value_type
|
||||
&asm_entry = _asm_defines.GetOrCreateValue(name);
|
||||
NameAndAttributes &asm_info = _asm_defines[asm_entry.getKey().data()];
|
||||
asm_info.name = name;
|
||||
asm_info.attributes = scope;
|
||||
asm_info.isFunction = false;
|
||||
asm_info.symbol = 0;
|
||||
// FIXME: This is trying to take care of module ASM like this:
|
||||
//
|
||||
// module asm ".zerofill __FOO, __foo, _bar_baz_qux, 0"
|
||||
//
|
||||
// but is gross and its mother dresses it funny. Have the ASM parser give us
|
||||
// more details for this type of situation so that we're not guessing so
|
||||
// much.
|
||||
|
||||
// fill information structure
|
||||
info.name = name;
|
||||
info.attributes =
|
||||
LTO_SYMBOL_PERMISSIONS_DATA | LTO_SYMBOL_DEFINITION_REGULAR | scope;
|
||||
info.isFunction = false;
|
||||
info.symbol = 0;
|
||||
|
||||
// add to table of symbols
|
||||
_symbols.push_back(info);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -464,20 +473,6 @@ void LTOModule::addPotentialUndefinedSymbol(GlobalValue *decl, bool isFunc) {
|
||||
if (entry.getValue().name)
|
||||
return;
|
||||
|
||||
StringMap<NameAndAttributes>::value_type &asm_entry =
|
||||
_asm_defines.GetOrCreateValue(name);
|
||||
|
||||
if (asm_entry.getValue().name != 0) {
|
||||
if (isFunc)
|
||||
addDefinedFunctionSymbol(cast<Function>(decl));
|
||||
else
|
||||
addDefinedDataSymbol(decl);
|
||||
|
||||
_symbols.back().attributes &= ~LTO_SYMBOL_SCOPE_MASK;
|
||||
_symbols.back().attributes |= asm_entry.getValue().attributes;
|
||||
return;
|
||||
}
|
||||
|
||||
NameAndAttributes info;
|
||||
|
||||
info.name = entry.getKey().data();
|
||||
|
@ -53,7 +53,6 @@ private:
|
||||
// _defines and _undefines only needed to disambiguate tentative definitions
|
||||
StringSet _defines;
|
||||
llvm::StringMap<NameAndAttributes> _undefines;
|
||||
llvm::StringMap<NameAndAttributes> _asm_defines;
|
||||
std::vector<const char*> _asm_undefines;
|
||||
llvm::MCContext _context;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user