wip global

This commit is contained in:
William S. Moses 2021-06-28 00:31:01 -04:00
parent 9c21321c0b
commit bc7ecebee7
2 changed files with 66 additions and 16 deletions

View File

@ -437,7 +437,7 @@ ValueWithOffsets MLIRScanner::VisitLambdaExpr(clang::LambdaExpr *expr) {
assert(CaptureKinds.find(pair.first) != CaptureKinds.end());
bool isArray = false;
auto at = Glob.getMLIRType(pair.second->getType(), &isArray);
Glob.getMLIRType(pair.second->getType(), &isArray);
if (CaptureKinds[pair.first] == LambdaCaptureKind::LCK_ByCopy)
CommonFieldLookup(expr->getCallOperator()->getThisObjectType(), pair.second, op).store(builder, params[pair.first], isArray);
@ -1010,7 +1010,7 @@ MLIRScanner::VisitConstructCommon(clang::CXXConstructExpr *cons, VarDecl* name,
bool isArray = false;
auto ty = Glob.getMLIRType(a->getType(), &isArray);
Glob.getMLIRType(a->getType(), &isArray);
mlir::Value val;
if (!isReference) {
@ -2846,7 +2846,7 @@ ValueWithOffsets MLIRScanner::CommonFieldLookup(clang::QualType CT, const FieldD
size_t fnum = 0;
auto CXRD = dyn_cast<CXXRecordDecl>(rd);
if (CXRD && CXRD->getNumBases() > 0 || rd->isUnion()) {
if ((CXRD && CXRD->getNumBases() > 0) || rd->isUnion()) {
auto &layout = Glob.CGM.getTypes().getCGRecordLayout(rd);
fnum = layout.getLLVMFieldNo(FD);
} else {
@ -3623,14 +3623,64 @@ mlir::LLVM::GlobalOp MLIRASTConsumer::GetOrCreateLLVMGlobal(const ValueDecl *FD)
}
std::string name = CGM.getMangledName(FD).str();
LLVM::Linkage lnk;
FD->dump();
switch (CGM.getLLVMLinkageVarDefinition(cast<VarDecl>(FD), /*isConstant*/false)) {
case llvm::GlobalValue::LinkageTypes::InternalLinkage:
lnk = LLVM::Linkage::Internal;
llvm::errs() << " FD name:" << name << " lnk: " << "internal" << "\n";
break;
case llvm::GlobalValue::LinkageTypes::ExternalLinkage:
lnk = LLVM::Linkage::External;
llvm::errs() << " FD name:" << name << " lnk: " << "extern" << "\n";
break;
case llvm::GlobalValue::LinkageTypes::AvailableExternallyLinkage:
lnk = LLVM::Linkage::AvailableExternally;
llvm::errs() << " FD name:" << name << " lnk: " << "availableextern" << "\n";
break;
case llvm::GlobalValue::LinkageTypes::LinkOnceAnyLinkage:
lnk = LLVM::Linkage::Linkonce;
llvm::errs() << " FD name:" << name << " lnk: " << "linkonce" << "\n";
break;
case llvm::GlobalValue::LinkageTypes::WeakAnyLinkage:
lnk = LLVM::Linkage::Weak;
llvm::errs() << " FD name:" << name << " lnk: " << "weak" << "\n";
break;
case llvm::GlobalValue::LinkageTypes::NoLinkage:
lnk = LLVM::Linkage::NoLinkage;
llvm::errs() << " FD name:" << name << " lnk: " << "none" << "\n";
break;
case llvm::GlobalValue::LinkageTypes::WeakODRLinkage:
lnk = LLVM::Linkage::WeakODR;
llvm::errs() << " FD name:" << name << " lnk: " << "weakodr" << "\n";
break;
case llvm::GlobalValue::LinkageTypes::CommonLinkage:
lnk = LLVM::Linkage::Common;
llvm::errs() << " FD name:" << name << " lnk: " << "common" << "\n";
break;
case llvm::GlobalValue::LinkageTypes::AppendingLinkage:
lnk = LLVM::Linkage::Appending;
llvm::errs() << " FD name:" << name << " lnk: " << "appending" << "\n";
break;
case llvm::GlobalValue::LinkageTypes::ExternalWeakLinkage:
lnk = LLVM::Linkage::ExternWeak;
llvm::errs() << " FD name:" << name << " lnk: " << "externweak" << "\n";
break;
case llvm::GlobalValue::LinkageTypes::LinkOnceODRLinkage:
lnk = LLVM::Linkage::LinkonceODR;
llvm::errs() << " FD name:" << name << " lnk: " << "linkonceodr" << "\n";
break;
case llvm::GlobalValue::LinkageTypes::PrivateLinkage:
lnk = LLVM::Linkage::Private;
llvm::errs() << " FD name:" << name << " lnk: " << "private" << "\n";
break;
}
auto rt = typeTranslator.translateType(anonymize(getLLVMType(FD->getType())));
mlir::OpBuilder builder(module.getContext());
builder.setInsertionPointToStart(module.getBody());
// auto lnk = CGM.getLLVMLinkageVarDefinition(FD, /*isConstant*/false);
// TODO handle proper global linkage
auto lnk = LLVM::Linkage::External;
return llvmGlobals[FD] = builder.create<LLVM::GlobalOp>(
module.getLoc(), rt, /*constant*/ false, lnk, name,
mlir::Attribute());
@ -3953,7 +4003,7 @@ mlir::Type MLIRASTConsumer::getMLIRType(clang::QualType qt, bool *implicitRef, b
}
auto CXRD = dyn_cast<CXXRecordDecl>(RT->getDecl());
if ( RT->getDecl()->isUnion() || (CXRD && CXRD->getNumBases() > 0) || ST->getNumElements() == 0 || recursive || !ST->isLiteral() && (ST->getName().contains("SmallVector") || ST->getName() == "struct._IO_FILE" || ST->getName() == "class.std::basic_ifstream" || ST->getName() == "class.std::basic_ostream" || ST->getName() == "class.std::basic_ofstream")) {
if ( RT->getDecl()->isUnion() || (CXRD && CXRD->getNumBases() > 0) || ST->getNumElements() == 0 || recursive || (!ST->isLiteral() && (ST->getName().contains("SmallVector") || ST->getName() == "struct._IO_FILE" || ST->getName() == "class.std::basic_ifstream" || ST->getName() == "class.std::basic_ostream" || ST->getName() == "class.std::basic_ofstream"))) {
return typeTranslator.translateType(anonymize(ST));
}
@ -4097,7 +4147,7 @@ mlir::Type MLIRASTConsumer::getMLIRType(llvm::Type *t) {
return typeTranslator.translateType(t);
}
if (auto ST = dyn_cast<llvm::StructType>(pt->getElementType())) {
if (ST->getNumElements() == 0 || !ST->isLiteral() && (ST->getName().contains("SmallVector") || ST->getName() == "struct._IO_FILE" || ST->getName() == "class.std::basic_ifstream" || ST->getName() == "class.std::basic_ostream" || ST->getName() == "class.std::basic_ofstream")) {
if (ST->getNumElements() == 0 || (!ST->isLiteral() && (ST->getName().contains("SmallVector") || ST->getName() == "struct._IO_FILE" || ST->getName() == "class.std::basic_ifstream" || ST->getName() == "class.std::basic_ostream" || ST->getName() == "class.std::basic_ofstream"))) {
return typeTranslator.translateType(t);
}
bool notAllSame = false;
@ -4162,7 +4212,7 @@ mlir::Type MLIRASTConsumer::getMLIRType(llvm::Type *t) {
}
}
if (!recursive && ST->getNumElements() == 1) return getMLIRType(ST->getTypeAtIndex(0U));
if (ST->getNumElements() == 0 || recursive || !ST->isLiteral() && (ST->getName().contains("SmallVector") || ST->getName() == "struct._IO_FILE" || ST->getName() == "class.std::basic_ifstream" || ST->getName() == "class.std::basic_ostream" || ST->getName() == "class.std::basic_ofstream")) {
if (ST->getNumElements() == 0 || recursive || (!ST->isLiteral() && (ST->getName().contains("SmallVector") || ST->getName() == "struct._IO_FILE" || ST->getName() == "class.std::basic_ifstream" || ST->getName() == "class.std::basic_ostream" || ST->getName() == "class.std::basic_ofstream"))) {
return typeTranslator.translateType(t);
}

View File

@ -145,7 +145,7 @@ struct ValueWithOffsets {
} else {
auto st = pt.getElementType().dyn_cast<LLVM::LLVMStructType>();
elty = st.getBody()[0];
assert(smt.getShape().back() == st.getBody().size());
assert(smt.getShape().back() == (ssize_t)st.getBody().size());
}
assert(elty == smt.getElementType());
elty = LLVM::LLVMPointerType::get(elty, pt.getAddressSpace());
@ -174,7 +174,7 @@ struct ValueWithOffsets {
} else {
auto st = pt.getElementType().dyn_cast<LLVM::LLVMStructType>();
elty = st.getBody()[0];
assert(smt.getShape().back() == st.getBody().size());
assert(smt.getShape().back() == (ssize_t)st.getBody().size());
}
assert(elty == smt.getElementType());
elty = LLVM::LLVMPointerType::get(elty, pt.getAddressSpace());
@ -332,8 +332,8 @@ struct PragmaScopHandler : public PragmaHandler {
PragmaScopHandler(ScopLocList &scops) : PragmaHandler("scop"), scops(scops) {}
virtual void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
Token &scopTok) {
void HandlePragma(Preprocessor &PP, PragmaIntroducer Introducer,
Token &scopTok) override {
auto &SM = PP.getSourceManager();
auto loc = scopTok.getLocation();
scops.addStart(SM, loc);
@ -346,8 +346,8 @@ struct PragmaEndScopHandler : public PragmaHandler {
PragmaEndScopHandler(ScopLocList &scops)
: PragmaHandler("endscop"), scops(scops) {}
virtual void HandlePragma(Preprocessor &PP, PragmaIntroducer introducer,
Token &endScopTok) {
void HandlePragma(Preprocessor &PP, PragmaIntroducer introducer,
Token &endScopTok) override {
auto &SM = PP.getSourceManager();
auto loc = endScopTok.getLocation();
scops.addEnd(SM, loc);
@ -419,7 +419,7 @@ struct MLIRASTConsumer : public ASTConsumer {
void run();
virtual bool HandleTopLevelDecl(DeclGroupRef dg);
bool HandleTopLevelDecl(DeclGroupRef dg) override;
void HandleDeclContext(DeclContext* DC);