Lines Matching +full:odr +full:- +full:value
1 //===- SymbolTable.cpp ----------------------------------------------------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
28 return symVector[it->second]; in find()
38 sym = symVector[p.first->second]; in insert()
45 sym->isUsedInRegularObj |= !file || isa<ObjFile>(file); in insert()
70 auto insertIt = llvm::upper_bound(toIsec->symbols, toOff, in transplantSymbolsAtOffset()
72 return cast<Defined>(s)->value < off; in transplantSymbolsAtOffset()
74 llvm::erase_if(fromIsec->symbols, [&](Symbol *s) { in transplantSymbolsAtOffset()
76 if (d->value != fromOff) in transplantSymbolsAtOffset()
82 insertIt = toIsec->symbols.insert(insertIt, d); in transplantSymbolsAtOffset()
83 d->originalIsec = toIsec; in transplantSymbolsAtOffset()
84 d->value = toOff; in transplantSymbolsAtOffset()
89 // own unwindEntry because of the ODR.) in transplantSymbolsAtOffset()
90 d->originalUnwindEntry = nullptr; in transplantSymbolsAtOffset()
97 InputSection *isec, uint64_t value, in addDefined() argument
111 if (defined->isWeakDef()) { in addDefined()
112 defined->privateExtern &= isPrivateExtern; in addDefined()
113 defined->weakDefCanBeHidden &= isWeakDefCanBeHidden; in addDefined()
114 defined->referencedDynamically |= isReferencedDynamically; in addDefined()
115 defined->noDeadStrip |= noDeadStrip; in addDefined()
118 concatIsec->wasCoalesced = true; in addDefined()
123 // added to an already-coalesced section. in addDefined()
124 if (defined->isec()) in addDefined()
125 transplantSymbolsAtOffset(concatIsec, defined->isec(), in addDefined()
126 /*skip=*/nullptr, value, defined->value); in addDefined()
131 if (defined->isWeakDef()) { in addDefined()
133 dyn_cast_or_null<ConcatInputSection>(defined->isec())) { in addDefined()
134 concatIsec->wasCoalesced = true; in addDefined()
136 transplantSymbolsAtOffset(concatIsec, isec, defined, defined->value, in addDefined()
137 value); in addDefined()
140 std::string srcLoc1 = defined->getSourceLocation(); in addDefined()
141 std::string srcLoc2 = isec ? isec->getSourceLocation(value) : ""; in addDefined()
142 std::string srcFile1 = toString(defined->getFile()); in addDefined()
150 overridesWeakDef = !isWeakDef && dysym->isWeakDef(); in addDefined()
151 dysym->unreference(); in addDefined()
153 if (undef->wasBitcodeSymbol) { in addDefined()
170 ") in the bitcode file(" + toString(undef->getFile()) + in addDefined()
171 ") is overridden by a non-native object (from bitcode): " + in addDefined()
174 } else if (!objFile->builtFromBitcode) { in addDefined()
181 // an ODR violation, we choose to permit this scenario as a warning. in addDefined()
184 toString(undef->getFile()) + in addDefined()
185 ") is overridden by a post-processed native " in addDefined()
192 file = undef->getFile(); in addDefined()
200 // With -flat_namespace, all extern symbols in dylibs are interposable. in addDefined()
201 // FIXME: Add support for `-interposable` (PR53680). in addDefined()
202 bool interposable = config->namespaceKind == NamespaceKind::flat && in addDefined()
203 config->outputType != MachO::MH_EXECUTE && in addDefined()
206 s, name, file, isec, value, size, isWeakDef, /*isExternal=*/true, in addDefined()
214 bool isPrivateExtern = makePrivateExtern || src->privateExtern; in aliasDefined()
215 return addDefined(target, newFile, src->isec(), src->value, src->size, in aliasDefined()
216 src->isWeakDef(), isPrivateExtern, in aliasDefined()
217 src->referencedDynamically, src->noDeadStrip, in aliasDefined()
218 src->weakDefCanBeHidden); in aliasDefined()
231 lazy->fetchArchiveMember(); in addUndefined()
233 extract(*s->getFile(), s->getName()); in addUndefined()
235 dynsym->reference(refState); in addUndefined()
237 undefined->refState = std::max(undefined->refState, refState); in addUndefined()
247 if (size < common->size) in addCommon()
252 // Common symbols take priority over all non-Defined symbols, so in case of in addCommon()
267 if (isWeakDef && !defined->isWeakDef()) in addDylib()
268 defined->overridesWeakDef = true; in addDylib()
270 refState = undefined->refState; in addDylib()
272 refState = dysym->getRefState(); in addDylib()
279 ((!isWeakDef && s->isWeakDef()) || in addDylib()
280 (!isDynamicLookup && cast<DylibSymbol>(s)->isDynamicLookup())))) { in addDylib()
282 dynsym->unreference(); in addDylib()
300 file->fetch(sym); in addLazyArchive()
302 if (dysym->isWeakDef()) { in addLazyArchive()
303 if (dysym->getRefState() != RefState::Unreferenced) in addLazyArchive()
304 file->fetch(sym); in addLazyArchive()
320 if (dysym->isWeakDef()) { in addLazyObject()
321 if (dysym->getRefState() != RefState::Unreferenced) in addLazyObject()
331 uint64_t value, bool isPrivateExtern, in addSynthetic() argument
334 assert(!isec || !isec->getFile()); // See makeSyntheticInputSection(). in addSynthetic()
335 Defined *s = addDefined(name, /*file=*/nullptr, isec, value, /*size=*/0, in addSynthetic()
339 s->includeInSymtab = includeInSymtab; in addSynthetic()
349 return symtab->addSynthetic( in createBoundarySymbol()
350 sym.getName(), /*isec=*/nullptr, /*value=*/-1, /*isPrivateExtern=*/true, in createBoundarySymbol()
359 // OutputSection -- it doesn't matter which one we pick. in handleSectionBoundarySymbol()
361 // ConcatInputSection -- we need to create ConcatInputSection for in handleSectionBoundarySymbol()
362 // non-existing sections anyways, and that codepath works even if we should in handleSectionBoundarySymbol()
368 if (ssec->segname == segName && ssec->name == sectName) { in handleSectionBoundarySymbol()
369 osec = ssec->isec->parent; in handleSectionBoundarySymbol()
380 assert(isec->live); in handleSectionBoundarySymbol()
384 osec = isec->parent = ConcatOutputSection::getOrCreateForInput(isec); in handleSectionBoundarySymbol()
389 osec->sectionStartSymbols.push_back(createBoundarySymbol(sym)); in handleSectionBoundarySymbol()
391 osec->sectionEndSymbols.push_back(createBoundarySymbol(sym)); in handleSectionBoundarySymbol()
398 seg->segmentStartSymbols.push_back(createBoundarySymbol(sym)); in handleSegmentBoundarySymbol()
400 seg->segmentEndSymbols.push_back(createBoundarySymbol(sym)); in handleSegmentBoundarySymbol()
429 // Handle -U. in recoverFromUndefinedSymbol()
430 if (config->explicitDynamicLookups.count(sym.getName())) { in recoverFromUndefinedSymbol()
431 symtab->addDynamicLookup(sym.getName()); in recoverFromUndefinedSymbol()
435 // Handle -undefined. in recoverFromUndefinedSymbol()
436 if (config->undefinedSymbolTreatment == in recoverFromUndefinedSymbol()
438 config->undefinedSymbolTreatment == UndefinedSymbolTreatment::suppress) { in recoverFromUndefinedSymbol()
439 symtab->addDynamicLookup(sym.getName()); in recoverFromUndefinedSymbol()
444 if (config->undefinedSymbolTreatment == UndefinedSymbolTreatment::warning) in recoverFromUndefinedSymbol()
445 symtab->addDynamicLookup(sym.getName()); in recoverFromUndefinedSymbol()
466 if (!config->deadStripDuplicates || duplicate.sym->isLive()) { in reportPendingDuplicateSymbols()
501 if (sym.getFile() && sym.getFile()->kind() == InputFile::ObjKind) { in getAlternativeSpelling()
503 for (const Symbol *s : sym.getFile()->symbols) in getAlternativeSpelling()
505 if (!defined->isExternal()) in getAlternativeSpelling()
506 map.try_emplace(s->getName(), s); in getAlternativeSpelling()
509 auto suggest = [&](StringRef newName) -> const Symbol * { in getAlternativeSpelling()
515 if (const Symbol *s = symtab->find(newName)) in getAlternativeSpelling()
523 // correction candidates and suggests the one that exists as a non-undefined in getAlternativeSpelling()
564 for (Symbol *sym : symtab->getSymbols()) in getAlternativeSpelling()
566 name.equals_insensitive(sym->getName())) in getAlternativeSpelling()
593 for (Symbol *sym : symtab->getSymbols()) in getAlternativeSpelling()
594 if (canSuggestExternCForCXX(nameWithoutUnderscore, sym->getName())) { in getAlternativeSpelling()
612 if (config->archMultiple) in reportUndefinedSymbol()
613 message += (" for arch " + getArchitectureName(config->arch())).str(); in reportUndefinedSymbol()
629 std::string src = loc.isec->getSourceLocation(loc.offset); in reportUndefinedSymbol()
632 message += loc.isec->getLocation(loc.offset); in reportUndefinedSymbol()
640 ("\n>>> referenced " + Twine(totalReferences - i) + " more times") in reportUndefinedSymbol()
649 if (corrected->getFile()) in reportUndefinedSymbol()
650 message += "\n>>> defined in: " + toString(corrected->getFile()); in reportUndefinedSymbol()
654 if (config->undefinedSymbolTreatment == UndefinedSymbolTreatment::error) in reportUndefinedSymbol()
656 else if (config->undefinedSymbolTreatment == in reportUndefinedSymbol()
660 assert(false && "diagnostics make sense for -undefined error|warning only"); in reportUndefinedSymbol()