Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(511)

Unified Diff: tools/llc/llc.cpp

Issue 12449014: ABI verifier: Add standalone tool pnacl-abicheck (Closed) Base URL: http://git.chromium.org/native_client/pnacl-llvm.git@master
Patch Set: cleanup, use << for error streams uniformly Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/Makefile ('k') | tools/pnacl-abicheck/CMakeLists.txt » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/llc/llc.cpp
diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp
index bdc14fc554b561b786e8cc20e3ccd770dcd8bff5..7294b3d34748898a45af497e48e424e7575d5d66 100644
--- a/tools/llc/llc.cpp
+++ b/tools/llc/llc.cpp
@@ -15,6 +15,7 @@
#include "llvm/IR/LLVMContext.h"
#include "llvm/ADT/Triple.h"
+#include "llvm/Analysis/NaCl.h"
#include "llvm/Assembly/PrintModulePass.h"
#include "llvm/Support/DataStream.h" // @LOCALMOD
#include "llvm/CodeGen/CommandFlags.h"
@@ -107,6 +108,14 @@ ReduceMemoryFootprint("reduce-memory-footprint",
cl::desc("Aggressively reduce memory used by llc"),
cl::init(false));
+static cl::opt<bool>
+PNaClABIVerify("pnaclabi-verify",
+ cl::desc("Verify PNaCl bitcode ABI before translating"),
+ cl::init(false));
+static cl::opt<bool>
+PNaClABIVerifyFatalErrors("pnaclabi-verify-fatal-errors",
+ cl::desc("PNaCl ABI verification errors are fatal"),
+ cl::init(false));
// @LOCALMOD-END
// Determine optimization level.
@@ -307,6 +316,20 @@ int llc_main(int argc, char **argv) {
return 0;
}
+// @LOCALMOD-BEGIN
+static void CheckABIVerifyErrors(PNaClABIErrorReporter &Reporter,
+ const Twine &Name) {
+ if (PNaClABIVerify && Reporter.getErrorCount() > 0) {
+ errs() << (PNaClABIVerifyFatalErrors ? "ERROR:" : "WARNING:");
+ errs() << Name << " is not valid PNaCl bitcode:\n";
+ Reporter.printErrors(errs());
+ if (PNaClABIVerifyFatalErrors)
+ exit(1);
+ }
+ Reporter.reset();
+}
+// @LOCALMOD-END
+
static int compileModule(char **argv, LLVMContext &Context) {
// Load the module to be compiled...
SMDiagnostic Err;
@@ -317,6 +340,8 @@ static int compileModule(char **argv, LLVMContext &Context) {
bool SkipModule = MCPU == "help" ||
(!MAttrs.empty() && MAttrs.front() == "help");
+ PNaClABIErrorReporter ABIErrorReporter; // @LOCALMOD
+
// If user just wants to list available options, skip module loading
if (!SkipModule) {
// @LOCALMOD-BEGIN
@@ -346,6 +371,12 @@ static int compileModule(char **argv, LLVMContext &Context) {
}
// @LOCALMOD-BEGIN
+ if (PNaClABIVerify) {
+ // Verify the module (but not the functions yet)
+ ModulePass *VerifyPass = createPNaClABIVerifyModulePass(&ABIErrorReporter);
+ VerifyPass->runOnModule(*mod);
+ CheckABIVerifyErrors(ABIErrorReporter, "Module");
+ }
#if defined(__native_client__) && defined(NACL_SRPC)
RecordMetadataForSrpc(*mod);
@@ -472,6 +503,13 @@ static int compileModule(char **argv, LLVMContext &Context) {
PM.reset(new FunctionPassManager(mod));
else
PM.reset(new PassManager());
+
+ // Add the ABI verifier pass before the analysis and code emission passes.
+ FunctionPass *FunctionVerifyPass = NULL;
+ if (PNaClABIVerify) {
+ FunctionVerifyPass = createPNaClABIVerifyFunctionsPass(&ABIErrorReporter);
+ PM->add(FunctionVerifyPass);
+ }
// @LOCALMOD-END
// Add an appropriate TargetLibraryInfo pass for the module's triple.
@@ -506,6 +544,7 @@ static int compileModule(char **argv, LLVMContext &Context) {
raw_fd_ostream ROS(GetObjectFileFD(), true);
ROS.SetBufferSize(1 << 20);
formatted_raw_ostream FOS(ROS);
+
// Ask the target to add backend passes as necessary.
if (Target.addPassesToEmitFile(*PM, FOS, FileType, NoVerify)) {
errs() << argv[0] << ": target does not support generation of this"
@@ -518,6 +557,7 @@ static int compileModule(char **argv, LLVMContext &Context) {
P->doInitialization();
for (Module::iterator I = mod->begin(), E = mod->end(); I != E; ++I) {
P->run(*I);
+ CheckABIVerifyErrors(ABIErrorReporter, "Function " + I->getName());
if (ReduceMemoryFootprint) {
I->Dematerialize();
}
@@ -570,6 +610,7 @@ static int compileModule(char **argv, LLVMContext &Context) {
P->doInitialization();
for (Module::iterator I = mod->begin(), E = mod->end(); I != E; ++I) {
P->run(*I);
+ CheckABIVerifyErrors(ABIErrorReporter, "Function " + I->getName());
if (ReduceMemoryFootprint) {
I->Dematerialize();
}
« no previous file with comments | « tools/Makefile ('k') | tools/pnacl-abicheck/CMakeLists.txt » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698