After some discussion with Doug, we decided that it made a lot more sense

for __unknown_anytype resolution to destructively modify the AST.  So that's
what it does now, which significantly simplifies some of the implementation.
Normal member calls work pretty cleanly now, and I added support for
propagating unknown-ness through &.

llvm-svn: 129331
This commit is contained in:
John McCall
2011-04-12 00:42:48 +00:00
parent 11168326f8
commit 2979fe01da
19 changed files with 282 additions and 355 deletions

View File

@@ -1072,54 +1072,6 @@ llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D,
return GetOrCreateLLVMGlobal(MangledName, PTy, D);
}
/// getAddrOfUnknownAnyDecl - Return an llvm::Constant for the address
/// of a global which was declared with unknown type. It is possible
/// for a VarDecl to end up getting resolved to have function type,
/// which complicates this substantially; on the other hand, these are
/// always external references, which does simplify the logic a lot.
llvm::Constant *
CodeGenModule::getAddrOfUnknownAnyDecl(const NamedDecl *decl, QualType type) {
GlobalDecl global;
// FunctionDecls will always end up with function types, but
// VarDecls can end up with them too.
if (isa<FunctionDecl>(decl))
global = GlobalDecl(cast<FunctionDecl>(decl));
else
global = GlobalDecl(cast<VarDecl>(decl));
llvm::StringRef mangledName = getMangledName(global);
const llvm::Type *ty = getTypes().ConvertTypeForMem(type);
const llvm::PointerType *pty =
llvm::PointerType::get(ty, getContext().getTargetAddressSpace(type));
// Check for an existing global value with this name.
llvm::GlobalValue *entry = GetGlobalValue(mangledName);
if (entry)
return llvm::ConstantExpr::getBitCast(entry, pty);
// If we're creating something with function type, go ahead and
// create a function.
if (const llvm::FunctionType *fnty = dyn_cast<llvm::FunctionType>(ty)) {
llvm::Function *fn = llvm::Function::Create(fnty,
llvm::Function::ExternalLinkage,
mangledName, &getModule());
return fn;
// Otherwise, make a global variable.
} else {
llvm::GlobalVariable *var
= new llvm::GlobalVariable(getModule(), ty, false,
llvm::GlobalValue::ExternalLinkage,
0, mangledName, 0,
false, pty->getAddressSpace());
if (isa<VarDecl>(decl) && cast<VarDecl>(decl)->isThreadSpecified())
var->setThreadLocal(true);
return var;
}
}
/// CreateRuntimeVariable - Create a new runtime global variable with the
/// specified type and name.
llvm::Constant *