[PATCH] MIR Serialization: Create dummy functions for the parsed machine functions when MIR file doesn't contain LLVM IR.
Alex L
arphaman at gmail.com
Mon Jun 15 16:13:13 PDT 2015
Thanks, I committed the patch with your suggestions applied in r239778.
Alex.
2015-05-29 12:06 GMT-07:00 Duncan P. N. Exon Smith <dexonsmith at apple.com>:
>
> > On 2015-May-29, at 11:33, Alex Lorenz <arphaman at gmail.com> wrote:
> >
> > Hi dexonsmith, bogner, bob.wilson,
> >
> > This patch is based on the patch that connects MIRParser to the machine
> function analysis pass (http://reviews.llvm.org/D9928).
> >
> > This patch creates dummy LLVM functions with one basic block and a
> return instruction for the parsed machine functions when the MIR file
> doesn't include LLVM IR.
> > This is needed as the machine function analysis pass creates machine
> functions only for the functions defined in the current LLVM module.
> >
> > REPOSITORY
> > rL LLVM
> >
> > http://reviews.llvm.org/D10135
> >
> > Files:
> > lib/CodeGen/MIRParser/MIRParser.cpp
> > test/CodeGen/MIR/llvmIRMissing.mir
> >
> I'm skeptical that testcases without backing LLVM IR are going to prove
> useful. This particular patch doesn't seem to be too complicated, so
> I'm fine with it, but I think you should focus on serializing MIR that
> *has* matching LLVM IR.
>
> A few comments below; otherwise LGTM.
>
> > Index: lib/CodeGen/MIRParser/MIRParser.cpp
> > ===================================================================
> > --- lib/CodeGen/MIRParser/MIRParser.cpp
> > +++ lib/CodeGen/MIRParser/MIRParser.cpp
> > @@ -19,6 +19,7 @@
> > #include "llvm/AsmParser/Parser.h"
> > #include "llvm/CodeGen/MachineFunction.h"
> > #include "llvm/CodeGen/MIRYamlMapping.h"
> > +#include "llvm/IR/Instructions.h"
> > #include "llvm/IR/Module.h"
> > #include "llvm/Support/SMLoc.h"
> > #include "llvm/Support/SourceMgr.h"
> > @@ -51,13 +52,17 @@
> > /// Parse the machine function in the current YAML document.
> > ///
> > /// Return true if an error occurred.
>
> You should document the effect that `NoLLVMIR` has.
>
> > - bool parseMachineFunction(yaml::Input &In);
> > + bool parseMachineFunction(yaml::Input &In, Module &M, bool NoLLVMIR);
> >
> > /// Initialize the machine function to the state that's described in
> the MIR
> > /// file.
> > ///
> > /// Return true if error occurred.
> > bool initializeMachineFunction(MachineFunction &MF, SMDiagnostic
> &Error);
> > +
> > +private:
> > + /// Create an empty function with the given name.
> > + void createDummyFunction(StringRef Name, Module &M);
> > };
> >
> > } // end namespace llvm
> > @@ -84,6 +89,7 @@
> > }
> >
> > std::unique_ptr<Module> M;
> > + bool NoLLVMIR = false;
> > // Parse the block scalar manually so that we can return unique
> pointer
> > // without having to go trough YAML traits.
> > if (const auto *BSN =
> > @@ -98,28 +104,40 @@
> > } else {
> > // Create an new, empty module.
> > M = llvm::make_unique<Module>(Filename, Context);
> > + NoLLVMIR = true;
> > }
> >
> > // Parse the machine functions.
> > do {
> > - if (parseMachineFunction(In))
> > + if (parseMachineFunction(In, *M, NoLLVMIR))
> > return nullptr;
> > In.nextDocument();
> > } while (In.setCurrentDocument());
> >
> > return M;
> > }
> >
> > -bool MIRParserImpl::parseMachineFunction(yaml::Input &In) {
> > +bool MIRParserImpl::parseMachineFunction(yaml::Input &In, Module &M,
> > + bool NoLLVMIR) {
> > auto MF = llvm::make_unique<yaml::MachineFunction>();
> > yaml::yamlize(In, *MF, false);
> > if (In.error())
> > return true;
> > auto FunctionName = MF->Name;
> > Functions.insert(std::make_pair(FunctionName, std::move(MF)));
> > + if (NoLLVMIR)
> > + createDummyFunction(FunctionName, M);
> > return false;
> > }
> >
> > +void MIRParserImpl::createDummyFunction(StringRef Name, Module &M) {
> > + auto &Context = M.getContext();
> > + Function *F = cast<Function>(M.getOrInsertFunction(
> > + Name, FunctionType::get(Type::getVoidTy(Context), false)));
> > + BasicBlock *BB = BasicBlock::Create(Context, "Entry", F);
> > + ReturnInst::Create(Context, nullptr, BB);
>
> `unreachable` is a simpler terminator than `ret void`, so I think it
> makes more sense in a dummy function.
> > +}
> > +
> > bool MIRParserImpl::initializeMachineFunction(MachineFunction &MF,
> > SMDiagnostic &Error) {
> > auto It = Functions.find(MF.getName());
> > Index: test/CodeGen/MIR/llvmIRMissing.mir
> > ===================================================================
> > --- test/CodeGen/MIR/llvmIRMissing.mir
> > +++ test/CodeGen/MIR/llvmIRMissing.mir
> > @@ -1,5 +1,7 @@
> > -# RUN: llc -start-after branch-folder -stop-after branch-folder -o
> /dev/null %s
> > +# RUN: llc -start-after branch-folder -stop-after branch-folder -o
> /dev/null %s | FileCheck %s
> > # This test ensures that the MIR parser accepts files without the LLVM
> IR.
> >
> > ---
> > +# CHECK: name: foo
> > +name: foo
> > ...
> >
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150615/03ee48ef/attachment.html>
More information about the llvm-commits
mailing list