Lines Matching full:symbol

17 #include "flang/Semantics/symbol.h"
42 SymbolAndOffset(Symbol &s, std::size_t off, const EquivalenceObject &obj)
43 : symbol{s}, offset{off}, object{&obj} {}
45 MutableSymbolRef symbol;
50 void DoCommonBlock(Symbol &);
51 void DoEquivalenceBlockBase(Symbol &, SizeAndAlignment &);
57 Symbol &, std::optional<const size_t> newAlign = std::nullopt);
58 SizeAndAlignment GetSizeAndAlignment(const Symbol &, bool entire);
60 std::optional<size_t> CompAlignment(const Symbol &);
61 std::optional<size_t> HasSpecialAlign(const Symbol &, Scope &);
66 // symbol -> symbol+offset that determines its location, from EQUIVALENCE
68 // base symbol -> SizeAndAlignment for each distinct EQUIVALENCE block
83 std::optional<size_t> ComputeOffsetsHelper::CompAlignment(const Symbol &sym) {
117 const Symbol &sym, Scope &scope) {
123 if (symOwner.symbol() && symOwner.IsDerivedType() &&
124 symOwner.symbol()->attrs().HasAny({semantics::Attr::BIND_C}) &&
140 if (scope.symbol() && scope.IsDerivedTypeWithKindParameter()) {
147 // Build dependents_ from equivalences: symbol -> symbol+offset
151 // Compute a base symbol and overall block size for each
153 for (auto &[symbol, dep] : dependents_) {
155 CHECK(symbol->size() == 0);
156 auto symInfo{GetSizeAndAlignment(*symbol, true)};
157 symbol->set_size(symInfo.size);
158 Symbol &base{*dep.symbol};
171 for (auto &[symbol, blockInfo] : equivalenceBlock_) {
172 if (!FindCommonBlockContaining(*symbol)) {
173 DoSymbol(*symbol);
174 DoEquivalenceBlockBase(*symbol, blockInfo);
175 offset_ = std::max(offset_, symbol->offset() + blockInfo.size);
180 for (auto &symbol : scope.GetSymbols()) {
181 if (!FindCommonBlockContaining(*symbol) &&
182 dependents_.find(symbol) == dependents_.end() &&
183 equivalenceBlock_.find(symbol) == equivalenceBlock_.end()) {
190 newAlign = HasSpecialAlign(*symbol, scope);
192 DoSymbol(*symbol, newAlign);
193 if (auto *generic{symbol->detailsIf<GenericDetails>()}) {
194 if (Symbol * specific{generic->specific()};
213 for (auto &[symbol, dep] : dependents_) {
214 symbol->set_offset(dep.symbol->offset() + dep.offset);
215 if (const auto *block{FindCommonBlockContaining(*dep.symbol)}) {
216 symbol->get<ObjectEntityDetails>().set_commonBlock(*block);
223 auto it{dependents_.find(*dep.symbol)};
234 void ComputeOffsetsHelper::DoCommonBlock(Symbol &commonBlock) {
242 Symbol &symbol{*object};
244 commonBlock.name().empty() ? symbol.name() : commonBlock.name()};
245 if (std::size_t padding{DoSymbol(symbol.GetUltimate())}) {
248 commonBlock.name(), padding, symbol.name());
250 previous.emplace(symbol);
252 auto iter{dependents_.find(symbol)};
254 eqIter = equivalenceBlock_.find(symbol);
256 DoEquivalenceBlockBase(symbol, eqIter->second);
260 Symbol &base{*dep.symbol};
264 base.offset() != symbol.offset() - dep.offset) {
267 symbol.name(), base.name(), commonBlock.name());
272 symbol.name(), commonBlock.name(), base.name(),
275 } else if (dep.offset > symbol.offset()) { // 8.10.3(3)
278 symbol.name(), commonBlock.name(), base.name());
282 base.set_offset(symbol.offset() - dep.offset);
301 Symbol &symbol, SizeAndAlignment &blockInfo) {
302 if (symbol.size() > blockInfo.size) {
303 blockInfo.size = symbol.size();
313 Resolve(SymbolAndOffset{object.symbol, offset, object})};
318 // symbol will be the representative of this set, since the offsets
325 for (const auto &[symbol, offset, object] : symbolOffsets) {
326 if (symbol == base.symbol) {
329 context_.foldingContext(), *symbol, base.offset, 1)};
331 context_.foldingContext(), *symbol, offset, 1)};
343 symbol->name(), base.offset, offset)
346 symbol->name(), offset);
350 dependents_.emplace(*symbol,
351 SymbolAndOffset{*base.symbol, base.offset - offset, *object});
361 if (const auto *details{object.symbol.detailsIf<ObjectEntityDetails>()}) {
379 auto result{offset * GetSizeAndAlignment(object.symbol, false).size};
382 if (const DeclTypeSpec * type{object.symbol.GetType()}) {
393 Symbol &symbol, std::optional<const size_t> newAlign) {
394 if (!symbol.has<ObjectEntityDetails>() && !symbol.has<ProcEntityDetails>()) {
397 SizeAndAlignment s{GetSizeAndAlignment(symbol, true)};
405 symbol.set_size(s.size);
406 symbol.set_offset(offset_);
413 const Symbol &symbol, bool entire) -> SizeAndAlignment {
415 if (IsDescriptor(symbol)) {
416 auto dyType{evaluate::DynamicType::From(symbol)};
424 symbol.Rank(), needAddendum, lenParams)};
428 if (IsProcedurePointer(symbol)) {
432 if (IsProcedure(symbol)) {
437 symbol, foldingContext)}) {