diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -37,6 +37,7 @@ #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/Type.h" +#include using namespace clang; using namespace CodeGen; @@ -44,6 +45,11 @@ static_assert(clang::Sema::MaximumAlignment <= llvm::Value::MaximumAlignment, "Clang max alignment greater than what LLVM supports?"); +#include "llvm/Support/CommandLine.h" +static llvm::cl::opt ClUninitBegin("uninit-begin", llvm::cl::init(1)); +static llvm::cl::opt ClUninitEnd("uninit-end", llvm::cl::init(0)); +static llvm::cl::opt ClUninitPrint("uninit-print", llvm::cl::init(false)); + void CodeGenFunction::EmitDecl(const Decl &D) { switch (D.getKind()) { case Decl::BuiltinTemplate: @@ -1793,13 +1799,26 @@ const Address Loc = locIsByrefHeader ? emission.getObjectAddress(*this) : emission.Addr; + static const uint64_t HB = ClUninitBegin; + static const uint64_t HE = ClUninitEnd; + size_t v = llvm::hash_value( + D.getLocation().printToString(getContext().getSourceManager())); + bool attr = D.getAttr(); + if (v >= HB && v <= HE) { + if (ClUninitPrint) { + std::cerr << v << " " + << D.getLocation().printToString( + getContext().getSourceManager()) + << "\n"; + } + attr = true; + } // Note: constexpr already initializes everything correctly. LangOptions::TrivialAutoVarInitKind trivialAutoVarInit = (D.isConstexpr() ? LangOptions::TrivialAutoVarInitKind::Uninitialized - : (D.getAttr() - ? LangOptions::TrivialAutoVarInitKind::Uninitialized - : getContext().getLangOpts().getTrivialAutoVarInit())); + : (attr ? LangOptions::TrivialAutoVarInitKind::Uninitialized + : getContext().getLangOpts().getTrivialAutoVarInit())); auto initializeWhatIsTechnicallyUninitialized = [&](Address Loc) { if (trivialAutoVarInit ==