From 46463adc26e29075c4cf87cc8f51d5a191929938 Mon Sep 17 00:00:00 2001 From: Julian Büning Date: Sun, 28 Oct 2018 16:11:18 +0100 Subject: fix Executor::initializeGlobals for aliases pointing to another alias --- lib/Core/Executor.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/lib/Core/Executor.cpp b/lib/Core/Executor.cpp index ef996e7e..7aaaa87c 100644 --- a/lib/Core/Executor.cpp +++ b/lib/Core/Executor.cpp @@ -736,11 +736,19 @@ void Executor::initializeGlobals(ExecutionState &state) { } // link aliases to their definitions (if bound) - for (Module::alias_iterator i = m->alias_begin(), ie = m->alias_end(); - i != ie; ++i) { + for (auto i = m->alias_begin(), ie = m->alias_end(); i != ie; ++i) { // Map the alias to its aliasee's address. This works because we have - // addresses for everything, even undefined functions. - globalAddresses.insert(std::make_pair(&*i, evalConstant(i->getAliasee()))); + // addresses for everything, even undefined functions. + + // Alias may refer to other alias, not necessarily known at this point. + // Thus, resolve to real alias directly. + const GlobalAlias *alias = &*i; + while (const auto *ga = dyn_cast(alias->getAliasee())) { + assert(ga != alias && "alias pointing to itself"); + alias = ga; + } + + globalAddresses.insert(std::make_pair(&*i, evalConstant(alias->getAliasee()))); } // once all objects are allocated, do the actual initialization -- cgit 1.4.1