diff options
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/bugpoint/BugDriver.cpp | 18 | ||||
-rw-r--r-- | llvm/tools/bugpoint/BugDriver.h | 37 | ||||
-rw-r--r-- | llvm/tools/bugpoint/CrashDebugger.cpp | 124 | ||||
-rw-r--r-- | llvm/tools/bugpoint/ExecutionDriver.cpp | 57 | ||||
-rw-r--r-- | llvm/tools/bugpoint/ExtractFunction.cpp | 64 | ||||
-rw-r--r-- | llvm/tools/bugpoint/Miscompilation.cpp | 40 | ||||
-rw-r--r-- | llvm/tools/bugpoint/OptimizerDriver.cpp | 2 | ||||
-rw-r--r-- | llvm/tools/bugpoint/ToolRunner.cpp | 32 | ||||
-rw-r--r-- | llvm/tools/bugpoint/bugpoint.cpp | 2 | ||||
-rw-r--r-- | llvm/tools/llc/llc.cpp | 5 | ||||
-rw-r--r-- | llvm/tools/lli/lli.cpp | 397 | ||||
-rw-r--r-- | llvm/tools/llvm-c-test/debuginfo.c | 5 | ||||
-rw-r--r-- | llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-jitlink/llvm-jitlink.cpp | 63 | ||||
-rw-r--r-- | llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp | 2 | ||||
-rw-r--r-- | llvm/tools/llvm-mc/llvm-mc.cpp | 2 | ||||
-rw-r--r-- | llvm/tools/llvm-ml/llvm-ml.cpp | 2 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 8 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 2 | ||||
-rw-r--r-- | llvm/tools/obj2yaml/elf2yaml.cpp | 7 |
20 files changed, 457 insertions, 416 deletions
diff --git a/llvm/tools/bugpoint/BugDriver.cpp b/llvm/tools/bugpoint/BugDriver.cpp index 2bdfebe..a7e93f6 100644 --- a/llvm/tools/bugpoint/BugDriver.cpp +++ b/llvm/tools/bugpoint/BugDriver.cpp @@ -27,9 +27,7 @@ #include <memory> using namespace llvm; -namespace llvm { -Triple TargetTriple; -} +Triple llvm::TargetTriple; DiscardTemp::~DiscardTemp() { if (SaveTemps) { @@ -41,18 +39,14 @@ DiscardTemp::~DiscardTemp() { errs() << "Failed to delete temp file " << toString(std::move(E)) << '\n'; } -// Anonymous namespace to define command line options for debugging. -// -namespace { // Output - The user can specify a file containing the expected output of the // program. If this filename is set, it is used as the reference diff source, // otherwise the raw input run through an interpreter is used as the reference // source. // -cl::opt<std::string> OutputFile("output", - cl::desc("Specify a reference program output " - "(for miscompilation detection)")); -} +static cl::opt<std::string> + OutputFile("output", cl::desc("Specify a reference program output " + "(for miscompilation detection)")); /// If we reduce or update the program somehow, call this method to update /// bugdriver with it. This deletes the old module and sets the specified one @@ -238,7 +232,7 @@ Error BugDriver::run() { return Error::success(); } -void llvm::PrintFunctionList(const std::vector<Function *> &Funcs) { +void llvm::printFunctionList(const std::vector<Function *> &Funcs) { unsigned NumPrint = Funcs.size(); if (NumPrint > 10) NumPrint = 10; @@ -249,7 +243,7 @@ void llvm::PrintFunctionList(const std::vector<Function *> &Funcs) { outs().flush(); } -void llvm::PrintGlobalVariableList(const std::vector<GlobalVariable *> &GVs) { +void llvm::printGlobalVariableList(const std::vector<GlobalVariable *> &GVs) { unsigned NumPrint = GVs.size(); if (NumPrint > 10) NumPrint = 10; diff --git a/llvm/tools/bugpoint/BugDriver.h b/llvm/tools/bugpoint/BugDriver.h index e3117ec..ca57405 100644 --- a/llvm/tools/bugpoint/BugDriver.h +++ b/llvm/tools/bugpoint/BugDriver.h @@ -57,7 +57,6 @@ class BugDriver { // FIXME: sort out public/private distinctions... friend class ReducePassList; - friend class ReduceMisCodegenFunctions; public: BugDriver(const char *toolname, bool find_bugs, unsigned timeout, @@ -76,7 +75,7 @@ public: void setPassesToRun(const std::vector<std::string> &PTR) { PassesToRun = PTR; } - const std::vector<std::string> &getPassesToRun() const { return PassesToRun; } + ArrayRef<std::string> getPassesToRun() const { return PassesToRun; } /// run - The top level method that is invoked after all of the instance /// variables are set up from command line arguments. The \p as_child argument @@ -111,7 +110,6 @@ public: Error debugCodeGenerator(); /// isExecutingJIT - Returns true if bugpoint is currently testing the JIT - /// bool isExecutingJIT(); Module &getProgram() const { return *Program; } @@ -167,7 +165,7 @@ public: bool RemoveBitcode = false) const; /// This function is used to output M to a file named "bugpoint-ID.bc". - void EmitProgressBitcode(const Module &M, const std::string &ID, + void emitProgressBitcode(const Module &M, const std::string &ID, bool NoFlyer = false) const; /// This method clones the current Program and deletes the specified @@ -214,7 +212,6 @@ public: /// outs() a single line message indicating whether compilation was successful /// or failed, unless Quiet is set. ExtraArgs specifies additional arguments /// to pass to the child bugpoint instance. - /// bool runPasses(Module &Program, const std::vector<std::string> &PassesToRun, std::string &OutputFilename, bool DeleteOutput = false, bool Quiet = false, @@ -223,7 +220,6 @@ public: /// runPasses - Just like the method above, but this just returns true or /// false indicating whether or not the optimizer crashed on the specified /// input (true = crashed). Does not produce any output. - /// bool runPasses(Module &M, const std::vector<std::string> &PassesToRun) const { std::string Filename; return runPasses(M, PassesToRun, Filename, true); @@ -247,7 +243,6 @@ public: private: /// initializeExecutionEnvironment - This method is used to set up the /// environment for executing LLVM programs. - /// Error initializeExecutionEnvironment(); }; @@ -258,37 +253,31 @@ struct DiscardTemp { /// Given a bitcode or assembly input filename, parse and return it, or return /// null if not possible. -/// std::unique_ptr<Module> parseInputFile(StringRef InputFilename, LLVMContext &ctxt); /// getPassesString - Turn a list of passes into a string which indicates the /// command line options that must be passed to add the passes. -/// std::string getPassesString(const std::vector<std::string> &Passes); -/// PrintFunctionList - prints out list of problematic functions -/// -void PrintFunctionList(const std::vector<Function *> &Funcs); +/// Prints out list of problematic functions +void printFunctionList(const std::vector<Function *> &Funcs); -/// PrintGlobalVariableList - prints out list of problematic global variables -/// -void PrintGlobalVariableList(const std::vector<GlobalVariable *> &GVs); +/// Prints out list of problematic global variables +void printGlobalVariableList(const std::vector<GlobalVariable *> &GVs); -// DeleteGlobalInitializer - "Remove" the global variable by deleting its -// initializer, making it external. -// -void DeleteGlobalInitializer(GlobalVariable *GV); +/// "Remove" the global variable by deleting its initializer, making it +/// external. +void deleteGlobalInitializer(GlobalVariable *GV); -// DeleteFunctionBody - "Remove" the function by deleting all of it's basic -// blocks, making it external. -// -void DeleteFunctionBody(Function *F); +/// "Remove" the function by deleting all of it's basic blocks, making it +/// external. +void deleteFunctionBody(Function *F); /// Given a module and a list of functions in the module, split the functions /// OUT of the specified module, and place them in the new module. std::unique_ptr<Module> -SplitFunctionsOutOfModule(Module *M, const std::vector<Function *> &F, +splitFunctionsOutOfModule(Module *M, const std::vector<Function *> &F, ValueToValueMapTy &VMap); } // End llvm namespace diff --git a/llvm/tools/bugpoint/CrashDebugger.cpp b/llvm/tools/bugpoint/CrashDebugger.cpp index fcac014..240300b 100644 --- a/llvm/tools/bugpoint/CrashDebugger.cpp +++ b/llvm/tools/bugpoint/CrashDebugger.cpp @@ -36,39 +36,44 @@ #include <set> using namespace llvm; -namespace { -cl::opt<bool> KeepMain("keep-main", - cl::desc("Force function reduction to keep main"), - cl::init(false)); -cl::opt<bool> NoGlobalRM("disable-global-remove", - cl::desc("Do not remove global variables"), - cl::init(false)); - -cl::opt<bool> NoAttributeRM("disable-attribute-remove", - cl::desc("Do not remove function attributes"), - cl::init(false)); - -cl::opt<bool> ReplaceFuncsWithNull( +static cl::opt<bool> KeepMain("keep-main", + cl::desc("Force function reduction to keep main"), + cl::init(false)); +static cl::opt<bool> NoGlobalRM("disable-global-remove", + cl::desc("Do not remove global variables"), + cl::init(false)); + +static cl::opt<bool> + NoAttributeRM("disable-attribute-remove", + cl::desc("Do not remove function attributes"), + cl::init(false)); + +static cl::opt<bool> ReplaceFuncsWithNull( "replace-funcs-with-null", cl::desc("When stubbing functions, replace all uses will null"), cl::init(false)); -cl::opt<bool> DontReducePassList("disable-pass-list-reduction", - cl::desc("Skip pass list reduction steps"), - cl::init(false)); - -cl::opt<bool> NoNamedMDRM("disable-namedmd-remove", - cl::desc("Do not remove global named metadata"), - cl::init(false)); -cl::opt<bool> NoStripDebugInfo("disable-strip-debuginfo", - cl::desc("Do not strip debug info metadata"), - cl::init(false)); -cl::opt<bool> NoStripDebugTypeInfo("disable-strip-debug-types", - cl::desc("Do not strip debug type info metadata"), - cl::init(false)); -cl::opt<bool> VerboseErrors("verbose-errors", - cl::desc("Print the output of crashing program"), - cl::init(false)); -} + +static cl::opt<bool> + DontReducePassList("disable-pass-list-reduction", + cl::desc("Skip pass list reduction steps"), + cl::init(false)); + +static cl::opt<bool> + NoNamedMDRM("disable-namedmd-remove", + cl::desc("Do not remove global named metadata"), + cl::init(false)); +static cl::opt<bool> + NoStripDebugInfo("disable-strip-debuginfo", + cl::desc("Do not strip debug info metadata"), + cl::init(false)); +static cl::opt<bool> + NoStripDebugTypeInfo("disable-strip-debug-types", + cl::desc("Do not strip debug type info metadata"), + cl::init(false)); +static cl::opt<bool> + VerboseErrors("verbose-errors", + cl::desc("Print the output of crashing program"), + cl::init(false)); static bool isValidModule(std::unique_ptr<Module> &M, bool ExitOnFailure = true) { @@ -83,6 +88,8 @@ static bool isValidModule(std::unique_ptr<Module> &M, } namespace llvm { +// Note this class needs to be in llvm namespace since its declared as a friend +// of BugDriver. class ReducePassList : public ListReducer<std::string> { BugDriver &BD; @@ -95,7 +102,7 @@ public: Expected<TestResult> doTest(std::vector<std::string> &Removed, std::vector<std::string> &Kept) override; }; -} +} // namespace llvm Expected<ReducePassList::TestResult> ReducePassList::doTest(std::vector<std::string> &Prefix, @@ -156,7 +163,7 @@ public: bool TestGlobalVariables(std::vector<GlobalVariable *> &GVs); }; -} +} // namespace bool ReduceCrashingGlobalInitializers::TestGlobalVariables( std::vector<GlobalVariable *> &GVs) { @@ -174,14 +181,14 @@ bool ReduceCrashingGlobalInitializers::TestGlobalVariables( } outs() << "Checking for crash with only these global variables: "; - PrintGlobalVariableList(GVs); + printGlobalVariableList(GVs); outs() << ": "; // Loop over and delete any global variables which we aren't supposed to be // playing with... for (GlobalVariable &I : M->globals()) if (I.hasInitializer() && !GVSet.count(&I)) { - DeleteGlobalInitializer(&I); + deleteGlobalInitializer(&I); I.setLinkage(GlobalValue::ExternalLinkage); I.setComdat(nullptr); } @@ -223,7 +230,7 @@ public: bool TestFuncs(std::vector<Function *> &Prefix); }; -} +} // namespace static void RemoveFunctionReferences(Module *M, const char *Name) { auto *UsedVar = M->getGlobalVariable(Name, true); @@ -269,14 +276,14 @@ bool ReduceCrashingFunctions::TestFuncs(std::vector<Function *> &Funcs) { } outs() << "Checking for crash with only these functions: "; - PrintFunctionList(Funcs); + printFunctionList(Funcs); outs() << ": "; if (!ReplaceFuncsWithNull) { // Loop over and delete any functions which we aren't supposed to be playing // with... for (Function &I : *M) if (!I.isDeclaration() && !Functions.count(&I)) - DeleteFunctionBody(&I); + deleteFunctionBody(&I); } else { std::vector<GlobalValue *> ToRemove; // First, remove aliases to functions we're about to purge. @@ -356,7 +363,7 @@ public: bool TestFuncAttrs(std::vector<Attribute> &Attrs); }; -} +} // namespace bool ReduceCrashingFunctionAttributes::TestFuncAttrs( std::vector<Attribute> &Attrs) { @@ -396,12 +403,11 @@ bool ReduceCrashingFunctionAttributes::TestFuncAttrs( return false; } -namespace { /// Simplify the CFG without completely destroying it. /// This is not well defined, but basically comes down to "try to eliminate /// unreachable blocks and constant fold terminators without deciding that /// certain undefined behavior cuts off the program at the legs". -void simpleSimplifyCfg(Function &F, SmallVectorImpl<BasicBlock *> &BBs) { +static void simpleSimplifyCfg(Function &F, SmallVectorImpl<BasicBlock *> &BBs) { if (F.empty()) return; @@ -435,6 +441,8 @@ void simpleSimplifyCfg(Function &F, SmallVectorImpl<BasicBlock *> &BBs) { for (auto *BB : Unreachable) BB->eraseFromParent(); } + +namespace { /// ReduceCrashingBlocks reducer - This works by setting the terminators of /// all terminators except the specified basic blocks to a 'ret' instruction, /// then running the simplifycfg pass. This has the effect of chopping up @@ -459,7 +467,7 @@ public: bool TestBlocks(std::vector<const BasicBlock *> &Prefix); }; -} +} // namespace bool ReduceCrashingBlocks::TestBlocks(std::vector<const BasicBlock *> &BBs) { // Clone the program to try hacking it apart... @@ -571,7 +579,7 @@ public: bool TestBlocks(std::vector<const BasicBlock *> &Prefix); }; -} +} // namespace bool ReduceCrashingConditionals::TestBlocks( std::vector<const BasicBlock *> &BBs) { @@ -670,7 +678,7 @@ public: bool TestBlocks(std::vector<const BasicBlock *> &Prefix); }; -} +} // namespace bool ReduceSimplifyCFG::TestBlocks(std::vector<const BasicBlock *> &BBs) { // Clone the program to try hacking it apart... @@ -755,7 +763,7 @@ public: bool TestInsts(std::vector<const Instruction *> &Prefix); }; -} +} // namespace bool ReduceCrashingInstructions::TestInsts( std::vector<const Instruction *> &Insts) { @@ -896,7 +904,7 @@ public: bool TestNamedMDs(std::vector<std::string> &NamedMDs); }; -} +} // namespace bool ReduceCrashingNamedMD::TestNamedMDs(std::vector<std::string> &NamedMDs) { @@ -959,7 +967,7 @@ public: bool TestNamedMDOps(std::vector<const MDNode *> &NamedMDOps); }; -} +} // namespace bool ReduceCrashingNamedMDOps::TestNamedMDOps( std::vector<const MDNode *> &NamedMDOps) { @@ -1018,7 +1026,7 @@ static Error ReduceGlobalInitializers(BugDriver &BD, BugTester TestFn) { for (GlobalVariable &GV : M->globals()) { if (GV.hasInitializer()) { - DeleteGlobalInitializer(&GV); + deleteGlobalInitializer(&GV); GV.setLinkage(GlobalValue::ExternalLinkage); GV.setComdat(nullptr); DeletedInit = true; @@ -1056,7 +1064,7 @@ static Error ReduceGlobalInitializers(BugDriver &BD, BugTester TestFn) { return E; if (GVs.size() < OldSize) - BD.EmitProgressBitcode(BD.getProgram(), "reduced-global-variables"); + BD.emitProgressBitcode(BD.getProgram(), "reduced-global-variables"); } return Error::success(); } @@ -1155,7 +1163,7 @@ static Error ReduceInsts(BugDriver &BD, BugTester TestFn) { return E; } - BD.EmitProgressBitcode(BD.getProgram(), "reduced-instructions"); + BD.emitProgressBitcode(BD.getProgram(), "reduced-instructions"); return Error::success(); } @@ -1186,7 +1194,7 @@ static Error DebugACrash(BugDriver &BD, BugTester TestFn) { return E; if (Functions.size() < OldSize) - BD.EmitProgressBitcode(BD.getProgram(), "reduced-function"); + BD.emitProgressBitcode(BD.getProgram(), "reduced-function"); } if (!NoAttributeRM) { @@ -1218,7 +1226,7 @@ static Error DebugACrash(BugDriver &BD, BugTester TestFn) { } if (OldSize < NewSize) - BD.EmitProgressBitcode(BD.getProgram(), "reduced-function-attributes"); + BD.emitProgressBitcode(BD.getProgram(), "reduced-function-attributes"); } } @@ -1238,7 +1246,7 @@ static Error DebugACrash(BugDriver &BD, BugTester TestFn) { if (Error E = Result.takeError()) return E; if (Blocks.size() < OldSize) - BD.EmitProgressBitcode(BD.getProgram(), "reduced-conditionals"); + BD.emitProgressBitcode(BD.getProgram(), "reduced-conditionals"); } // Attempt to delete entire basic blocks at a time to speed up @@ -1256,7 +1264,7 @@ static Error DebugACrash(BugDriver &BD, BugTester TestFn) { if (Error E = Result.takeError()) return E; if (Blocks.size() < OldSize) - BD.EmitProgressBitcode(BD.getProgram(), "reduced-blocks"); + BD.emitProgressBitcode(BD.getProgram(), "reduced-blocks"); } if (!DisableSimplifyCFG && !BugpointIsInterrupted) { @@ -1269,7 +1277,7 @@ static Error DebugACrash(BugDriver &BD, BugTester TestFn) { if (Error E = Result.takeError()) return E; if (Blocks.size() < OldSize) - BD.EmitProgressBitcode(BD.getProgram(), "reduced-simplifycfg"); + BD.emitProgressBitcode(BD.getProgram(), "reduced-simplifycfg"); } // Attempt to delete instructions using bisection. This should help out nasty @@ -1319,7 +1327,7 @@ static Error DebugACrash(BugDriver &BD, BugTester TestFn) { if (Error E = Result.takeError()) return E; } - BD.EmitProgressBitcode(BD.getProgram(), "reduced-named-md"); + BD.emitProgressBitcode(BD.getProgram(), "reduced-named-md"); } // Try to clean up the testcase by running funcresolve and globaldce... @@ -1334,7 +1342,7 @@ static Error DebugACrash(BugDriver &BD, BugTester TestFn) { std::move(M)); // Yup, it does, keep the reduced version... } - BD.EmitProgressBitcode(BD.getProgram(), "reduced-simplified"); + BD.emitProgressBitcode(BD.getProgram(), "reduced-simplified"); return Error::success(); } @@ -1361,7 +1369,7 @@ Error BugDriver::debugOptimizerCrash(const std::string &ID) { << (PassesToRun.size() == 1 ? ": " : "es: ") << getPassesString(PassesToRun) << '\n'; - EmitProgressBitcode(*Program, ID); + emitProgressBitcode(*Program, ID); auto Res = DebugACrash(*this, TestForOptimizerCrash); if (Res || DontReducePassList) @@ -1376,7 +1384,7 @@ Error BugDriver::debugOptimizerCrash(const std::string &ID) { << (PassesToRun.size() == 1 ? ": " : "es: ") << getPassesString(PassesToRun) << '\n'; - EmitProgressBitcode(getProgram(), "reduced-simplified"); + emitProgressBitcode(getProgram(), "reduced-simplified"); return Res; } diff --git a/llvm/tools/bugpoint/ExecutionDriver.cpp b/llvm/tools/bugpoint/ExecutionDriver.cpp index 165b55f..8c6b7fb 100644 --- a/llvm/tools/bugpoint/ExecutionDriver.cpp +++ b/llvm/tools/bugpoint/ExecutionDriver.cpp @@ -36,15 +36,16 @@ enum OutputType { CompileCustom, Custom }; +} // namespace -cl::opt<double> AbsTolerance("abs-tolerance", - cl::desc("Absolute error tolerated"), - cl::init(0.0)); -cl::opt<double> RelTolerance("rel-tolerance", - cl::desc("Relative error tolerated"), - cl::init(0.0)); +static cl::opt<double> AbsTolerance("abs-tolerance", + cl::desc("Absolute error tolerated"), + cl::init(0.0)); +static cl::opt<double> RelTolerance("rel-tolerance", + cl::desc("Relative error tolerated"), + cl::init(0.0)); -cl::opt<OutputType> InterpreterSel( +static cl::opt<OutputType> InterpreterSel( cl::desc("Specify the \"test\" i.e. suspect back-end:"), cl::values(clEnumValN(AutoPick, "auto", "Use best guess"), clEnumValN(RunLLI, "run-int", "Execute with the interpreter"), @@ -60,7 +61,7 @@ cl::opt<OutputType> InterpreterSel( "the bitcode. Useful for cross-compilation.")), cl::init(AutoPick)); -cl::opt<OutputType> SafeInterpreterSel( +static cl::opt<OutputType> SafeInterpreterSel( cl::desc("Specify \"safe\" i.e. known-good backend:"), cl::values(clEnumValN(AutoPick, "safe-auto", "Use best guess"), clEnumValN(RunLLC, "safe-run-llc", "Compile with LLC"), @@ -69,16 +70,16 @@ cl::opt<OutputType> SafeInterpreterSel( "the bitcode. Useful for cross-compilation.")), cl::init(AutoPick)); -cl::opt<std::string> SafeInterpreterPath( +static cl::opt<std::string> SafeInterpreterPath( "safe-path", cl::desc("Specify the path to the \"safe\" backend program"), cl::init("")); -cl::opt<bool> AppendProgramExitCode( +static cl::opt<bool> AppendProgramExitCode( "append-exit-code", cl::desc("Append the exit code to the output so it gets diff'd too"), cl::init(false)); -cl::opt<std::string> +static cl::opt<std::string> InputFile("input", cl::init("/dev/null"), cl::desc("Filename to pipe in as stdin (default: /dev/null)")); @@ -89,20 +90,19 @@ static cl::list<std::string> static cl::list<std::string> AdditionalLinkerArgs( "Xlinker", cl::desc("Additional arguments to pass to the linker")); -cl::opt<std::string> CustomCompileCommand( +static cl::opt<std::string> CustomCompileCommand( "compile-command", cl::init("llc"), cl::desc("Command to compile the bitcode (use with -compile-custom) " "(default: llc)")); -cl::opt<std::string> CustomExecCommand( +static cl::opt<std::string> CustomExecCommand( "exec-command", cl::init("simulate"), cl::desc("Command to execute the bitcode (use with -run-custom) " "(default: simulate)")); -} -namespace llvm { // Anything specified after the --args option are taken as arguments to the // program being debugged. +namespace llvm { cl::list<std::string> InputArgv("args", cl::Positional, cl::desc("<program arguments>..."), cl::PositionalEatsArgs); @@ -110,25 +110,22 @@ cl::list<std::string> InputArgv("args", cl::Positional, cl::opt<std::string> OutputPrefix("output-prefix", cl::init("bugpoint"), cl::desc("Prefix to use for outputs (default: 'bugpoint')")); -} - -namespace { -cl::list<std::string> ToolArgv("tool-args", cl::Positional, - cl::desc("<tool arguments>..."), - cl::PositionalEatsArgs); +} // namespace llvm -cl::list<std::string> SafeToolArgv("safe-tool-args", cl::Positional, - cl::desc("<safe-tool arguments>..."), - cl::PositionalEatsArgs); +static cl::list<std::string> ToolArgv("tool-args", cl::Positional, + cl::desc("<tool arguments>..."), + cl::PositionalEatsArgs); -cl::opt<std::string> CCBinary("gcc", cl::init(""), - cl::desc("The gcc binary to use.")); +static cl::list<std::string> SafeToolArgv("safe-tool-args", cl::Positional, + cl::desc("<safe-tool arguments>..."), + cl::PositionalEatsArgs); -cl::list<std::string> CCToolArgv("gcc-tool-args", cl::Positional, - cl::desc("<gcc-tool arguments>..."), - cl::PositionalEatsArgs); -} +static cl::opt<std::string> CCBinary("gcc", cl::init(""), + cl::desc("The gcc binary to use.")); +static cl::list<std::string> CCToolArgv("gcc-tool-args", cl::Positional, + cl::desc("<gcc-tool arguments>..."), + cl::PositionalEatsArgs); //===----------------------------------------------------------------------===// // BugDriver method implementation // diff --git a/llvm/tools/bugpoint/ExtractFunction.cpp b/llvm/tools/bugpoint/ExtractFunction.cpp index dd9a82c..3206589 100644 --- a/llvm/tools/bugpoint/ExtractFunction.cpp +++ b/llvm/tools/bugpoint/ExtractFunction.cpp @@ -35,19 +35,19 @@ using namespace llvm; #define DEBUG_TYPE "bugpoint" +bool llvm::DisableSimplifyCFG = false; namespace llvm { -bool DisableSimplifyCFG = false; extern cl::opt<std::string> OutputPrefix; -} // End llvm namespace +} // namespace llvm -namespace { -cl::opt<bool> NoDCE("disable-dce", - cl::desc("Do not use the -dce pass to reduce testcases")); -cl::opt<bool, true> +static cl::opt<bool> + NoDCE("disable-dce", + cl::desc("Do not use the -dce pass to reduce testcases")); +static cl::opt<bool, true> NoSCFG("disable-simplifycfg", cl::location(DisableSimplifyCFG), cl::desc("Do not use the -simplifycfg pass to reduce testcases")); -Function *globalInitUsesExternalBA(GlobalVariable *GV) { +static Function *globalInitUsesExternalBA(GlobalVariable *GV) { if (!GV->hasInitializer()) return nullptr; @@ -78,7 +78,6 @@ Function *globalInitUsesExternalBA(GlobalVariable *GV) { } return nullptr; } -} // end anonymous namespace std::unique_ptr<Module> BugDriver::deleteInstructionFromProgram(const Instruction *I, @@ -154,7 +153,7 @@ std::unique_ptr<Module> BugDriver::extractLoop(Module *M) { std::unique_ptr<Module> NewM = runPassesOn(M, LoopExtractPasses); if (!NewM) { outs() << "*** Loop extraction failed: "; - EmitProgressBitcode(*M, "loopextraction", true); + emitProgressBitcode(*M, "loopextraction", true); outs() << "*** Sorry. :( Please report a bug!\n"; return nullptr; } @@ -198,21 +197,16 @@ static void eliminateAliases(GlobalValue *GV) { } } -// -// DeleteGlobalInitializer - "Remove" the global variable by deleting its -// initializer, -// making it external. -// -void llvm::DeleteGlobalInitializer(GlobalVariable *GV) { +// "Remove" the global variable by deleting its initializer, making it external. +void llvm::deleteGlobalInitializer(GlobalVariable *GV) { eliminateAliases(GV); GV->setInitializer(nullptr); GV->setComdat(nullptr); } -// DeleteFunctionBody - "Remove" the function by deleting all of its basic -// blocks, making it external. -// -void llvm::DeleteFunctionBody(Function *F) { +// "Remove" the function by deleting all of its basic blocks, making it +// external. +void llvm::deleteFunctionBody(Function *F) { eliminateAliases(F); // Function declarations can't have comdats. F->setComdat(nullptr); @@ -222,9 +216,9 @@ void llvm::DeleteFunctionBody(Function *F) { assert(F->isDeclaration() && "This didn't make the function external!"); } -/// GetTorInit - Given a list of entries for static ctors/dtors, return them +/// getTorInit - Given a list of entries for static ctors/dtors, return them /// as a constant array. -static Constant *GetTorInit(std::vector<std::pair<Function *, int>> &TorList) { +static Constant *getTorInit(std::vector<std::pair<Function *, int>> &TorList) { assert(!TorList.empty() && "Don't create empty tor list!"); std::vector<Constant *> ArrayElts; Type *Int32Ty = Type::getInt32Ty(TorList[0].first->getContext()); @@ -239,11 +233,11 @@ static Constant *GetTorInit(std::vector<std::pair<Function *, int>> &TorList) { ArrayType::get(ArrayElts[0]->getType(), ArrayElts.size()), ArrayElts); } -/// SplitStaticCtorDtor - A module was recently split into two parts, M1/M2, and +/// splitStaticCtorDtor - A module was recently split into two parts, M1/M2, and /// M1 has all of the global variables. If M2 contains any functions that are /// static ctors/dtors, we need to add an llvm.global_[cd]tors global to M2, and /// prune appropriate entries out of M1s list. -static void SplitStaticCtorDtor(const char *GlobalName, Module *M1, Module *M2, +static void splitStaticCtorDtor(const char *GlobalName, Module *M1, Module *M2, ValueToValueMapTy &VMap) { GlobalVariable *GV = M1->getNamedGlobal(GlobalName); if (!GV || GV->isDeclaration() || GV->hasLocalLinkage() || !GV->use_empty()) @@ -284,7 +278,7 @@ static void SplitStaticCtorDtor(const char *GlobalName, Module *M1, Module *M2, GV->eraseFromParent(); if (!M1Tors.empty()) { - Constant *M1Init = GetTorInit(M1Tors); + Constant *M1Init = getTorInit(M1Tors); new GlobalVariable(*M1, M1Init->getType(), false, GlobalValue::AppendingLinkage, M1Init, GlobalName); } @@ -295,14 +289,14 @@ static void SplitStaticCtorDtor(const char *GlobalName, Module *M1, Module *M2, GV->eraseFromParent(); if (!M2Tors.empty()) { - Constant *M2Init = GetTorInit(M2Tors); + Constant *M2Init = getTorInit(M2Tors); new GlobalVariable(*M2, M2Init->getType(), false, GlobalValue::AppendingLinkage, M2Init, GlobalName); } } std::unique_ptr<Module> -llvm::SplitFunctionsOutOfModule(Module *M, const std::vector<Function *> &F, +llvm::splitFunctionsOutOfModule(Module *M, const std::vector<Function *> &F, ValueToValueMapTy &VMap) { // Make sure functions & globals are all external so that linkage // between the two modules will work. @@ -326,13 +320,13 @@ llvm::SplitFunctionsOutOfModule(Module *M, const std::vector<Function *> &F, LLVM_DEBUG(TNOF->printAsOperand(errs(), false)); LLVM_DEBUG(errs() << "\n"); TestFunctions.insert(cast<Function>(NewVMap[TNOF])); - DeleteFunctionBody(TNOF); // Function is now external in this module! + deleteFunctionBody(TNOF); // Function is now external in this module! } // Remove the Safe functions from the Test module for (Function &I : *New) if (!TestFunctions.count(&I)) - DeleteFunctionBody(&I); + deleteFunctionBody(&I); // Try to split the global initializers evenly for (GlobalVariable &I : M->globals()) { @@ -348,17 +342,17 @@ llvm::SplitFunctionsOutOfModule(Module *M, const std::vector<Function *> &F, << TestFn->getName() << "'.\n"; exit(1); } - DeleteGlobalInitializer(&I); // Delete the initializer to make it external + deleteGlobalInitializer(&I); // Delete the initializer to make it external } else { // If we keep it in the safe module, then delete it in the test module - DeleteGlobalInitializer(GV); + deleteGlobalInitializer(GV); } } // Make sure that there is a global ctor/dtor array in both halves of the // module if they both have static ctor/dtor functions. - SplitStaticCtorDtor("llvm.global_ctors", M, New.get(), NewVMap); - SplitStaticCtorDtor("llvm.global_dtors", M, New.get(), NewVMap); + splitStaticCtorDtor("llvm.global_ctors", M, New.get(), NewVMap); + splitStaticCtorDtor("llvm.global_dtors", M, New.get(), NewVMap); return New; } @@ -375,7 +369,7 @@ BugDriver::extractMappedBlocksFromModule(const std::vector<BasicBlock *> &BBs, outs() << "*** Basic Block extraction failed!\n"; errs() << "Error creating temporary file: " << toString(Temp.takeError()) << "\n"; - EmitProgressBitcode(*M, "basicblockextractfail", true); + emitProgressBitcode(*M, "basicblockextractfail", true); return nullptr; } DiscardTemp Discard{*Temp}; @@ -399,7 +393,7 @@ BugDriver::extractMappedBlocksFromModule(const std::vector<BasicBlock *> &BBs, OS.flush(); if (OS.has_error()) { errs() << "Error writing list of blocks to not extract\n"; - EmitProgressBitcode(*M, "basicblockextractfail", true); + emitProgressBitcode(*M, "basicblockextractfail", true); OS.clear_error(); return nullptr; } @@ -413,7 +407,7 @@ BugDriver::extractMappedBlocksFromModule(const std::vector<BasicBlock *> &BBs, if (!Ret) { outs() << "*** Basic Block extraction failed, please report a bug!\n"; - EmitProgressBitcode(*M, "basicblockextractfail", true); + emitProgressBitcode(*M, "basicblockextractfail", true); } return Ret; } diff --git a/llvm/tools/bugpoint/Miscompilation.cpp b/llvm/tools/bugpoint/Miscompilation.cpp index 4cf7de3..a7f1643 100644 --- a/llvm/tools/bugpoint/Miscompilation.cpp +++ b/llvm/tools/bugpoint/Miscompilation.cpp @@ -33,16 +33,16 @@ extern cl::opt<std::string> OutputPrefix; extern cl::list<std::string> InputArgv; } // end namespace llvm -namespace { -static llvm::cl::opt<bool> DisableLoopExtraction( +static cl::opt<bool> DisableLoopExtraction( "disable-loop-extraction", cl::desc("Don't extract loops when searching for miscompilations"), cl::init(false)); -static llvm::cl::opt<bool> DisableBlockExtraction( +static cl::opt<bool> DisableBlockExtraction( "disable-block-extraction", cl::desc("Don't extract blocks when searching for miscompilations"), cl::init(false)); +namespace { class ReduceMiscompilingPasses : public ListReducer<std::string> { BugDriver &BD; @@ -71,7 +71,7 @@ ReduceMiscompilingPasses::doTest(std::vector<std::string> &Prefix, errs() << " Error running this sequence of passes" << " on the input program!\n"; BD.setPassesToRun(Suffix); - BD.EmitProgressBitcode(BD.getProgram(), "pass-error", false); + BD.emitProgressBitcode(BD.getProgram(), "pass-error", false); // TODO: This should propagate the error instead of exiting. if (Error E = BD.debugOptimizerCrash()) exit(1); @@ -113,7 +113,7 @@ ReduceMiscompilingPasses::doTest(std::vector<std::string> &Prefix, errs() << " Error running this sequence of passes" << " on the input program!\n"; BD.setPassesToRun(Prefix); - BD.EmitProgressBitcode(BD.getProgram(), "pass-error", false); + BD.emitProgressBitcode(BD.getProgram(), "pass-error", false); // TODO: This should propagate the error instead of exiting. if (Error E = BD.debugOptimizerCrash()) exit(1); @@ -158,7 +158,7 @@ ReduceMiscompilingPasses::doTest(std::vector<std::string> &Prefix, errs() << " Error running this sequence of passes" << " on the input program!\n"; BD.setPassesToRun(Suffix); - BD.EmitProgressBitcode(BD.getProgram(), "pass-error", false); + BD.emitProgressBitcode(BD.getProgram(), "pass-error", false); // TODO: This should propagate the error instead of exiting. if (Error E = BD.debugOptimizerCrash()) exit(1); @@ -253,7 +253,7 @@ ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function *> &Funcs) { << (Funcs.size() == 1 ? "this function is" : "these functions are") << " run through the pass" << (BD.getPassesToRun().size() == 1 ? "" : "es") << ":"; - PrintFunctionList(Funcs); + printFunctionList(Funcs); outs() << '\n'; // Create a clone for two reasons: @@ -277,7 +277,7 @@ ReduceMiscompilingFunctions::TestFuncs(const std::vector<Function *> &Funcs) { VMap.clear(); std::unique_ptr<Module> ToNotOptimize = CloneModule(BD.getProgram(), VMap); std::unique_ptr<Module> ToOptimize = - SplitFunctionsOutOfModule(ToNotOptimize.get(), FuncsOnClone, VMap); + splitFunctionsOutOfModule(ToNotOptimize.get(), FuncsOnClone, VMap); Expected<bool> Broken = TestFn(BD, std::move(ToOptimize), std::move(ToNotOptimize)); @@ -314,7 +314,7 @@ ExtractLoops(BugDriver &BD, ValueToValueMapTy VMap; std::unique_ptr<Module> ToNotOptimize = CloneModule(BD.getProgram(), VMap); - std::unique_ptr<Module> ToOptimize = SplitFunctionsOutOfModule( + std::unique_ptr<Module> ToOptimize = splitFunctionsOutOfModule( ToNotOptimize.get(), MiscompiledFunctions, VMap); std::unique_ptr<Module> ToOptimizeLoopExtracted = BD.extractLoop(ToOptimize.get()); @@ -517,7 +517,7 @@ ReduceMiscompiledBlocks::TestFuncs(const std::vector<BasicBlock *> &BBs) { std::unique_ptr<Module> ToNotOptimize = CloneModule(BD.getProgram(), VMap); std::unique_ptr<Module> ToOptimize = - SplitFunctionsOutOfModule(ToNotOptimize.get(), FuncsOnClone, VMap); + splitFunctionsOutOfModule(ToNotOptimize.get(), FuncsOnClone, VMap); // Try the extraction. If it doesn't work, then the block extractor crashed // or something, in which case bugpoint can't chase down this possibility. @@ -572,7 +572,7 @@ ExtractBlocks(BugDriver &BD, ValueToValueMapTy VMap; std::unique_ptr<Module> ProgClone = CloneModule(BD.getProgram(), VMap); std::unique_ptr<Module> ToExtract = - SplitFunctionsOutOfModule(ProgClone.get(), MiscompiledFunctions, VMap); + splitFunctionsOutOfModule(ProgClone.get(), MiscompiledFunctions, VMap); std::unique_ptr<Module> Extracted = BD.extractMappedBlocksFromModule(Blocks, ToExtract.get()); if (!Extracted) { @@ -638,7 +638,7 @@ static Expected<std::vector<Function *>> DebugAMiscompilation( outs() << "\n*** The following function" << (MiscompiledFunctions.size() == 1 ? " is" : "s are") << " being miscompiled: "; - PrintFunctionList(MiscompiledFunctions); + printFunctionList(MiscompiledFunctions); outs() << '\n'; // See if we can rip any loops out of the miscompiled functions and still @@ -663,7 +663,7 @@ static Expected<std::vector<Function *>> DebugAMiscompilation( outs() << "\n*** The following function" << (MiscompiledFunctions.size() == 1 ? " is" : "s are") << " being miscompiled: "; - PrintFunctionList(MiscompiledFunctions); + printFunctionList(MiscompiledFunctions); outs() << '\n'; } } @@ -686,7 +686,7 @@ static Expected<std::vector<Function *>> DebugAMiscompilation( outs() << "\n*** The following function" << (MiscompiledFunctions.size() == 1 ? " is" : "s are") << " being miscompiled: "; - PrintFunctionList(MiscompiledFunctions); + printFunctionList(MiscompiledFunctions); outs() << '\n'; } } @@ -708,7 +708,7 @@ static Expected<bool> TestOptimizer(BugDriver &BD, std::unique_ptr<Module> Test, if (!Optimized) { errs() << " Error running this sequence of passes" << " on the input program!\n"; - BD.EmitProgressBitcode(*Test, "pass-error", false); + BD.emitProgressBitcode(*Test, "pass-error", false); BD.setNewProgram(std::move(Test)); if (Error E = BD.debugOptimizerCrash()) return std::move(E); @@ -750,7 +750,7 @@ Error BugDriver::debugMiscompilation() { outs() << "\n*** Found miscompiling pass" << (getPassesToRun().size() == 1 ? "" : "es") << ": " << getPassesString(getPassesToRun()) << '\n'; - EmitProgressBitcode(*Program, "passinput"); + emitProgressBitcode(*Program, "passinput"); Expected<std::vector<Function *>> MiscompiledFunctions = DebugAMiscompilation(*this, TestOptimizer); @@ -762,15 +762,15 @@ Error BugDriver::debugMiscompilation() { ValueToValueMapTy VMap; Module *ToNotOptimize = CloneModule(getProgram(), VMap).release(); Module *ToOptimize = - SplitFunctionsOutOfModule(ToNotOptimize, *MiscompiledFunctions, VMap) + splitFunctionsOutOfModule(ToNotOptimize, *MiscompiledFunctions, VMap) .release(); outs() << " Non-optimized portion: "; - EmitProgressBitcode(*ToNotOptimize, "tonotoptimize", true); + emitProgressBitcode(*ToNotOptimize, "tonotoptimize", true); delete ToNotOptimize; // Delete hacked module. outs() << " Portion that is input to optimizer: "; - EmitProgressBitcode(*ToOptimize, "tooptimize"); + emitProgressBitcode(*ToOptimize, "tooptimize"); delete ToOptimize; // Delete hacked module. return Error::success(); @@ -1028,7 +1028,7 @@ Error BugDriver::debugCodeGenerator() { ValueToValueMapTy VMap; std::unique_ptr<Module> ToNotCodeGen = CloneModule(getProgram(), VMap); std::unique_ptr<Module> ToCodeGen = - SplitFunctionsOutOfModule(ToNotCodeGen.get(), *Funcs, VMap); + splitFunctionsOutOfModule(ToNotCodeGen.get(), *Funcs, VMap); // Condition the modules ToCodeGen = diff --git a/llvm/tools/bugpoint/OptimizerDriver.cpp b/llvm/tools/bugpoint/OptimizerDriver.cpp index 3daacfd..bf2e8c0 100644 --- a/llvm/tools/bugpoint/OptimizerDriver.cpp +++ b/llvm/tools/bugpoint/OptimizerDriver.cpp @@ -82,7 +82,7 @@ bool BugDriver::writeProgramToFile(const std::string &Filename, /// This function is used to output the current Program to a file named /// "bugpoint-ID.bc". -void BugDriver::EmitProgressBitcode(const Module &M, const std::string &ID, +void BugDriver::emitProgressBitcode(const Module &M, const std::string &ID, bool NoFlyer) const { // Output the input to the current pass to a bitcode file, emit a message // telling the user how to reproduce it: opt -foo blah.bc diff --git a/llvm/tools/bugpoint/ToolRunner.cpp b/llvm/tools/bugpoint/ToolRunner.cpp index f2f5966a..c67695f 100644 --- a/llvm/tools/bugpoint/ToolRunner.cpp +++ b/llvm/tools/bugpoint/ToolRunner.cpp @@ -25,29 +25,25 @@ using namespace llvm; #define DEBUG_TYPE "toolrunner" -namespace llvm { -cl::opt<bool> SaveTemps("save-temps", cl::init(false), - cl::desc("Save temporary files")); -} +cl::opt<bool> llvm::SaveTemps("save-temps", cl::init(false), + cl::desc("Save temporary files")); -namespace { -cl::opt<std::string> +static cl::opt<std::string> RemoteClient("remote-client", cl::desc("Remote execution client (rsh/ssh)")); -cl::opt<std::string> RemoteHost("remote-host", - cl::desc("Remote execution (rsh/ssh) host")); +static cl::opt<std::string> + RemoteHost("remote-host", cl::desc("Remote execution (rsh/ssh) host")); -cl::opt<std::string> RemotePort("remote-port", - cl::desc("Remote execution (rsh/ssh) port")); +static cl::opt<std::string> + RemotePort("remote-port", cl::desc("Remote execution (rsh/ssh) port")); -cl::opt<std::string> RemoteUser("remote-user", - cl::desc("Remote execution (rsh/ssh) user id")); +static cl::opt<std::string> + RemoteUser("remote-user", cl::desc("Remote execution (rsh/ssh) user id")); -cl::opt<std::string> +static cl::opt<std::string> RemoteExtra("remote-extra-options", cl::desc("Remote execution (rsh/ssh) extra options")); -} /// RunProgramWithTimeout - This function provides an alternate interface /// to the sys::Program::ExecuteAndWait interface. @@ -160,7 +156,7 @@ public: const std::vector<std::string> &SharedLibs = std::vector<std::string>(), unsigned Timeout = 0, unsigned MemoryLimit = 0) override; }; -} +} // namespace Expected<int> LLI::ExecuteProgram(const std::string &Bitcode, const std::vector<std::string> &Args, @@ -258,7 +254,7 @@ public: inconvertibleErrorCode()); } }; -} +} // namespace Error CustomCompiler::compileProgram(const std::string &Bitcode, unsigned Timeout, unsigned MemoryLimit) { @@ -301,7 +297,7 @@ public: const std::vector<std::string> &SharedLibs = std::vector<std::string>(), unsigned Timeout = 0, unsigned MemoryLimit = 0) override; }; -} +} // namespace Expected<int> CustomExecutor::ExecuteProgram( const std::string &Bitcode, const std::vector<std::string> &Args, @@ -541,7 +537,7 @@ public: const std::vector<std::string> &SharedLibs = std::vector<std::string>(), unsigned Timeout = 0, unsigned MemoryLimit = 0) override; }; -} +} // namespace Expected<int> JIT::ExecuteProgram(const std::string &Bitcode, const std::vector<std::string> &Args, diff --git a/llvm/tools/bugpoint/bugpoint.cpp b/llvm/tools/bugpoint/bugpoint.cpp index 87581e80a..52ed135 100644 --- a/llvm/tools/bugpoint/bugpoint.cpp +++ b/llvm/tools/bugpoint/bugpoint.cpp @@ -90,7 +90,7 @@ public: D.addPass(std::string(PI->getPassArgument())); } }; -} +} // namespace #define HANDLE_EXTENSION(Ext) \ llvm::PassPluginLibraryInfo get##Ext##PluginInfo(); diff --git a/llvm/tools/llc/llc.cpp b/llvm/tools/llc/llc.cpp index f04b256..8b03db3 100644 --- a/llvm/tools/llc/llc.cpp +++ b/llvm/tools/llc/llc.cpp @@ -218,13 +218,12 @@ static cl::opt<std::string> PassPipeline( static cl::alias PassPipeline2("p", cl::aliasopt(PassPipeline), cl::desc("Alias for -passes")); -namespace { - -std::vector<std::string> &getRunPassNames() { +static std::vector<std::string> &getRunPassNames() { static std::vector<std::string> RunPassNames; return RunPassNames; } +namespace { struct RunPassOption { void operator=(const std::string &Val) const { if (Val.empty()) diff --git a/llvm/tools/lli/lli.cpp b/llvm/tools/lli/lli.cpp index 875ec1b..7fee06b 100644 --- a/llvm/tools/lli/lli.cpp +++ b/llvm/tools/lli/lli.cpp @@ -92,206 +92,202 @@ static codegen::RegisterCodeGenFlags CGF; #define DEBUG_TYPE "lli" namespace { - - enum class JITKind { MCJIT, Orc, OrcLazy }; - enum class JITLinkerKind { Default, RuntimeDyld, JITLink }; - - cl::opt<std::string> - InputFile(cl::desc("<input bitcode>"), cl::Positional, cl::init("-")); - - cl::list<std::string> - InputArgv(cl::ConsumeAfter, cl::desc("<program arguments>...")); - - cl::opt<bool> ForceInterpreter("force-interpreter", - cl::desc("Force interpretation: disable JIT"), - cl::init(false)); - - cl::opt<JITKind> UseJITKind( - "jit-kind", cl::desc("Choose underlying JIT kind."), - cl::init(JITKind::Orc), - cl::values(clEnumValN(JITKind::MCJIT, "mcjit", "MCJIT"), - clEnumValN(JITKind::Orc, "orc", "Orc JIT"), - clEnumValN(JITKind::OrcLazy, "orc-lazy", - "Orc-based lazy JIT."))); - - cl::opt<JITLinkerKind> - JITLinker("jit-linker", cl::desc("Choose the dynamic linker/loader."), - cl::init(JITLinkerKind::Default), - cl::values(clEnumValN(JITLinkerKind::Default, "default", - "Default for platform and JIT-kind"), - clEnumValN(JITLinkerKind::RuntimeDyld, "rtdyld", - "RuntimeDyld"), - clEnumValN(JITLinkerKind::JITLink, "jitlink", - "Orc-specific linker"))); - cl::opt<std::string> OrcRuntime("orc-runtime", - cl::desc("Use ORC runtime from given path"), - cl::init("")); - - cl::opt<unsigned> - LazyJITCompileThreads("compile-threads", - cl::desc("Choose the number of compile threads " - "(jit-kind=orc-lazy only)"), - cl::init(0)); - - cl::list<std::string> - ThreadEntryPoints("thread-entry", - cl::desc("calls the given entry-point on a new thread " - "(jit-kind=orc-lazy only)")); - - cl::opt<bool> PerModuleLazy( - "per-module-lazy", - cl::desc("Performs lazy compilation on whole module boundaries " - "rather than individual functions"), - cl::init(false)); - - cl::list<std::string> - JITDylibs("jd", - cl::desc("Specifies the JITDylib to be used for any subsequent " - "-extra-module arguments.")); - - cl::list<std::string> - Dylibs("dlopen", cl::desc("Dynamic libraries to load before linking")); - - // The MCJIT supports building for a target address space separate from - // the JIT compilation process. Use a forked process and a copying - // memory manager with IPC to execute using this functionality. - cl::opt<bool> RemoteMCJIT("remote-mcjit", - cl::desc("Execute MCJIT'ed code in a separate process."), +enum class JITKind { MCJIT, Orc, OrcLazy }; +enum class JITLinkerKind { Default, RuntimeDyld, JITLink }; +} // namespace + +static cl::opt<std::string> InputFile(cl::desc("<input bitcode>"), + cl::Positional, cl::init("-")); + +static cl::list<std::string> InputArgv(cl::ConsumeAfter, + cl::desc("<program arguments>...")); + +static cl::opt<bool> + ForceInterpreter("force-interpreter", + cl::desc("Force interpretation: disable JIT"), + cl::init(false)); + +static cl::opt<JITKind> + UseJITKind("jit-kind", cl::desc("Choose underlying JIT kind."), + cl::init(JITKind::Orc), + cl::values(clEnumValN(JITKind::MCJIT, "mcjit", "MCJIT"), + clEnumValN(JITKind::Orc, "orc", "Orc JIT"), + clEnumValN(JITKind::OrcLazy, "orc-lazy", + "Orc-based lazy JIT."))); + +static cl::opt<JITLinkerKind> JITLinker( + "jit-linker", cl::desc("Choose the dynamic linker/loader."), + cl::init(JITLinkerKind::Default), + cl::values(clEnumValN(JITLinkerKind::Default, "default", + "Default for platform and JIT-kind"), + clEnumValN(JITLinkerKind::RuntimeDyld, "rtdyld", "RuntimeDyld"), + clEnumValN(JITLinkerKind::JITLink, "jitlink", + "Orc-specific linker"))); +static cl::opt<std::string> + OrcRuntime("orc-runtime", cl::desc("Use ORC runtime from given path"), + cl::init("")); + +static cl::opt<unsigned> + LazyJITCompileThreads("compile-threads", + cl::desc("Choose the number of compile threads " + "(jit-kind=orc-lazy only)"), + cl::init(0)); + +static cl::list<std::string> + ThreadEntryPoints("thread-entry", + cl::desc("calls the given entry-point on a new thread " + "(jit-kind=orc-lazy only)")); + +static cl::opt<bool> PerModuleLazy( + "per-module-lazy", + cl::desc("Performs lazy compilation on whole module boundaries " + "rather than individual functions"), cl::init(false)); - // Manually specify the child process for remote execution. This overrides - // the simulated remote execution that allocates address space for child - // execution. The child process will be executed and will communicate with - // lli via stdin/stdout pipes. - cl::opt<std::string> - ChildExecPath("mcjit-remote-process", - cl::desc("Specify the filename of the process to launch " - "for remote MCJIT execution. If none is specified," - "\n\tremote execution will be simulated in-process."), - cl::value_desc("filename"), cl::init("")); - - // Determine optimization level. - cl::opt<char> OptLevel("O", - cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " - "(default = '-O2')"), - cl::Prefix, cl::init('2')); - - cl::opt<std::string> - TargetTriple("mtriple", cl::desc("Override target triple for module")); - - cl::opt<std::string> - EntryFunc("entry-function", - cl::desc("Specify the entry function (default = 'main') " - "of the executable"), - cl::value_desc("function"), - cl::init("main")); - - cl::list<std::string> - ExtraModules("extra-module", - cl::desc("Extra modules to be loaded"), - cl::value_desc("input bitcode")); - - cl::list<std::string> - ExtraObjects("extra-object", - cl::desc("Extra object files to be loaded"), - cl::value_desc("input object")); - - cl::list<std::string> - ExtraArchives("extra-archive", - cl::desc("Extra archive files to be loaded"), - cl::value_desc("input archive")); - - cl::opt<bool> - EnableCacheManager("enable-cache-manager", - cl::desc("Use cache manager to save/load modules"), - cl::init(false)); - - cl::opt<std::string> - ObjectCacheDir("object-cache-dir", - cl::desc("Directory to store cached object files " - "(must be user writable)"), - cl::init("")); - - cl::opt<std::string> - FakeArgv0("fake-argv0", - cl::desc("Override the 'argv[0]' value passed into the executing" - " program"), cl::value_desc("executable")); - - cl::opt<bool> - DisableCoreFiles("disable-core-files", cl::Hidden, - cl::desc("Disable emission of core files if possible")); - - cl::opt<bool> - NoLazyCompilation("disable-lazy-compilation", - cl::desc("Disable JIT lazy compilation"), - cl::init(false)); - - cl::opt<bool> - GenerateSoftFloatCalls("soft-float", - cl::desc("Generate software floating point library calls"), +static cl::list<std::string> + JITDylibs("jd", + cl::desc("Specifies the JITDylib to be used for any subsequent " + "-extra-module arguments.")); + +static cl::list<std::string> + Dylibs("dlopen", cl::desc("Dynamic libraries to load before linking")); + +// The MCJIT supports building for a target address space separate from +// the JIT compilation process. Use a forked process and a copying +// memory manager with IPC to execute using this functionality. +static cl::opt<bool> + RemoteMCJIT("remote-mcjit", + cl::desc("Execute MCJIT'ed code in a separate process."), + cl::init(false)); + +// Manually specify the child process for remote execution. This overrides +// the simulated remote execution that allocates address space for child +// execution. The child process will be executed and will communicate with +// lli via stdin/stdout pipes. +static cl::opt<std::string> ChildExecPath( + "mcjit-remote-process", + cl::desc("Specify the filename of the process to launch " + "for remote MCJIT execution. If none is specified," + "\n\tremote execution will be simulated in-process."), + cl::value_desc("filename"), cl::init("")); + +// Determine optimization level. +static cl::opt<char> + OptLevel("O", + cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " + "(default = '-O2')"), + cl::Prefix, cl::init('2')); + +static cl::opt<std::string> + TargetTriple("mtriple", cl::desc("Override target triple for module")); + +static cl::opt<std::string> + EntryFunc("entry-function", + cl::desc("Specify the entry function (default = 'main') " + "of the executable"), + cl::value_desc("function"), cl::init("main")); + +static cl::list<std::string> + ExtraModules("extra-module", cl::desc("Extra modules to be loaded"), + cl::value_desc("input bitcode")); + +static cl::list<std::string> + ExtraObjects("extra-object", cl::desc("Extra object files to be loaded"), + cl::value_desc("input object")); + +static cl::list<std::string> + ExtraArchives("extra-archive", cl::desc("Extra archive files to be loaded"), + cl::value_desc("input archive")); + +static cl::opt<bool> + EnableCacheManager("enable-cache-manager", + cl::desc("Use cache manager to save/load modules"), + cl::init(false)); + +static cl::opt<std::string> + ObjectCacheDir("object-cache-dir", + cl::desc("Directory to store cached object files " + "(must be user writable)"), + cl::init("")); + +static cl::opt<std::string> + FakeArgv0("fake-argv0", + cl::desc("Override the 'argv[0]' value passed into the executing" + " program"), + cl::value_desc("executable")); + +static cl::opt<bool> + DisableCoreFiles("disable-core-files", cl::Hidden, + cl::desc("Disable emission of core files if possible")); + +static cl::opt<bool> NoLazyCompilation("disable-lazy-compilation", + cl::desc("Disable JIT lazy compilation"), + cl::init(false)); + +static cl::opt<bool> GenerateSoftFloatCalls( + "soft-float", cl::desc("Generate software floating point library calls"), cl::init(false)); - cl::opt<bool> NoProcessSymbols( - "no-process-syms", - cl::desc("Do not resolve lli process symbols in JIT'd code"), - cl::init(false)); - - enum class LLJITPlatform { Inactive, Auto, ExecutorNative, GenericIR }; - - cl::opt<LLJITPlatform> Platform( - "lljit-platform", cl::desc("Platform to use with LLJIT"), - cl::init(LLJITPlatform::Auto), - cl::values(clEnumValN(LLJITPlatform::Auto, "Auto", - "Like 'ExecutorNative' if ORC runtime " - "provided, otherwise like 'GenericIR'"), - clEnumValN(LLJITPlatform::ExecutorNative, "ExecutorNative", - "Use the native platform for the executor." - "Requires -orc-runtime"), - clEnumValN(LLJITPlatform::GenericIR, "GenericIR", - "Use LLJITGenericIRPlatform"), - clEnumValN(LLJITPlatform::Inactive, "Inactive", - "Disable platform support explicitly")), - cl::Hidden); - - enum class DumpKind { - NoDump, - DumpFuncsToStdOut, - DumpModsToStdOut, - DumpModsToDisk, - DumpDebugDescriptor, - DumpDebugObjects, - }; +static cl::opt<bool> NoProcessSymbols( + "no-process-syms", + cl::desc("Do not resolve lli process symbols in JIT'd code"), + cl::init(false)); - cl::opt<DumpKind> OrcDumpKind( - "orc-lazy-debug", cl::desc("Debug dumping for the orc-lazy JIT."), - cl::init(DumpKind::NoDump), - cl::values( - clEnumValN(DumpKind::NoDump, "no-dump", "Don't dump anything."), - clEnumValN(DumpKind::DumpFuncsToStdOut, "funcs-to-stdout", - "Dump function names to stdout."), - clEnumValN(DumpKind::DumpModsToStdOut, "mods-to-stdout", - "Dump modules to stdout."), - clEnumValN(DumpKind::DumpModsToDisk, "mods-to-disk", - "Dump modules to the current " - "working directory. (WARNING: " - "will overwrite existing files)."), - clEnumValN(DumpKind::DumpDebugDescriptor, "jit-debug-descriptor", - "Dump __jit_debug_descriptor contents to stdout"), - clEnumValN(DumpKind::DumpDebugObjects, "jit-debug-objects", - "Dump __jit_debug_descriptor in-memory debug " - "objects as tool output")), - cl::Hidden); - - ExitOnError ExitOnErr; -} +enum class LLJITPlatform { Inactive, Auto, ExecutorNative, GenericIR }; + +static cl::opt<LLJITPlatform> Platform( + "lljit-platform", cl::desc("Platform to use with LLJIT"), + cl::init(LLJITPlatform::Auto), + cl::values(clEnumValN(LLJITPlatform::Auto, "Auto", + "Like 'ExecutorNative' if ORC runtime " + "provided, otherwise like 'GenericIR'"), + clEnumValN(LLJITPlatform::ExecutorNative, "ExecutorNative", + "Use the native platform for the executor." + "Requires -orc-runtime"), + clEnumValN(LLJITPlatform::GenericIR, "GenericIR", + "Use LLJITGenericIRPlatform"), + clEnumValN(LLJITPlatform::Inactive, "Inactive", + "Disable platform support explicitly")), + cl::Hidden); + +enum class DumpKind { + NoDump, + DumpFuncsToStdOut, + DumpModsToStdOut, + DumpModsToDisk, + DumpDebugDescriptor, + DumpDebugObjects, +}; -LLVM_ATTRIBUTE_USED void linkComponents() { +static cl::opt<DumpKind> OrcDumpKind( + "orc-lazy-debug", cl::desc("Debug dumping for the orc-lazy JIT."), + cl::init(DumpKind::NoDump), + cl::values(clEnumValN(DumpKind::NoDump, "no-dump", "Don't dump anything."), + clEnumValN(DumpKind::DumpFuncsToStdOut, "funcs-to-stdout", + "Dump function names to stdout."), + clEnumValN(DumpKind::DumpModsToStdOut, "mods-to-stdout", + "Dump modules to stdout."), + clEnumValN(DumpKind::DumpModsToDisk, "mods-to-disk", + "Dump modules to the current " + "working directory. (WARNING: " + "will overwrite existing files)."), + clEnumValN(DumpKind::DumpDebugDescriptor, "jit-debug-descriptor", + "Dump __jit_debug_descriptor contents to stdout"), + clEnumValN(DumpKind::DumpDebugObjects, "jit-debug-objects", + "Dump __jit_debug_descriptor in-memory debug " + "objects as tool output")), + cl::Hidden); + +static ExitOnError ExitOnErr; + +LLVM_ATTRIBUTE_USED static void linkComponents() { errs() << (void *)&llvm_orc_registerEHFrameSectionAllocAction << (void *)&llvm_orc_deregisterEHFrameSectionAllocAction << (void *)&llvm_orc_registerJITLoaderGDBWrapper << (void *)&llvm_orc_registerJITLoaderGDBAllocAction; } +namespace { //===----------------------------------------------------------------------===// // Object cache // @@ -367,6 +363,7 @@ private: return true; } }; +} // namespace // On Mingw and Cygwin, an external symbol named '__main' is called from the // generated 'main' function to allow static initialization. To avoid linking @@ -400,7 +397,7 @@ static void addCygMingExtraModule(ExecutionEngine &EE, LLVMContext &Context, EE.addModule(std::move(M)); } -CodeGenOptLevel getOptLevel() { +static CodeGenOptLevel getOptLevel() { if (auto Level = CodeGenOpt::parseLevel(OptLevel)) return *Level; WithColor::error(errs(), "lli") << "invalid optimization level.\n"; @@ -412,10 +409,10 @@ CodeGenOptLevel getOptLevel() { exit(1); } -Error loadDylibs(); -int runOrcJIT(const char *ProgName); -void disallowOrcOptions(); -Expected<std::unique_ptr<orc::ExecutorProcessControl>> launchRemote(); +static Error loadDylibs(); +static int runOrcJIT(const char *ProgName); +static void disallowOrcOptions(); +static Expected<std::unique_ptr<orc::ExecutorProcessControl>> launchRemote(); //===----------------------------------------------------------------------===// // main Driver function @@ -863,7 +860,7 @@ static std::function<void(MemoryBuffer &)> createObjDebugDumper() { llvm_unreachable("Unknown DumpKind"); } -Error loadDylibs() { +static Error loadDylibs() { for (const auto &Dylib : Dylibs) { std::string ErrMsg; if (sys::DynamicLibrary::LoadLibraryPermanently(Dylib.c_str(), &ErrMsg)) @@ -875,7 +872,7 @@ Error loadDylibs() { static void exitOnLazyCallThroughFailure() { exit(1); } -Expected<orc::ThreadSafeModule> +static Expected<orc::ThreadSafeModule> loadModule(StringRef Path, orc::ThreadSafeContext TSCtx) { SMDiagnostic Err; auto M = TSCtx.withContextDo( @@ -895,7 +892,7 @@ loadModule(StringRef Path, orc::ThreadSafeContext TSCtx) { return orc::ThreadSafeModule(std::move(M), std::move(TSCtx)); } -int mingw_noop_main(void) { +static int mingw_noop_main(void) { // Cygwin and MinGW insert calls from the main function to the runtime // function __main. The __main function is responsible for setting up main's // environment (e.g. running static constructors), however this is not needed @@ -912,7 +909,7 @@ int mingw_noop_main(void) { // Try to enable debugger support for the given instance. // This alway returns success, but prints a warning if it's not able to enable // debugger support. -Error tryEnableDebugSupport(orc::LLJIT &J) { +static Error tryEnableDebugSupport(orc::LLJIT &J) { if (auto Err = enableDebuggerSupport(J)) { [[maybe_unused]] std::string ErrMsg = toString(std::move(Err)); LLVM_DEBUG(dbgs() << "lli: " << ErrMsg << "\n"); @@ -920,7 +917,7 @@ Error tryEnableDebugSupport(orc::LLJIT &J) { return Error::success(); } -int runOrcJIT(const char *ProgName) { +static int runOrcJIT(const char *ProgName) { // Start setting up the JIT environment. // Parse the main module. @@ -1187,7 +1184,7 @@ int runOrcJIT(const char *ProgName) { return Result; } -void disallowOrcOptions() { +static void disallowOrcOptions() { // Make sure nobody used an orc-lazy specific option accidentally. if (LazyJITCompileThreads != 0) { @@ -1206,7 +1203,7 @@ void disallowOrcOptions() { } } -Expected<std::unique_ptr<orc::ExecutorProcessControl>> launchRemote() { +static Expected<std::unique_ptr<orc::ExecutorProcessControl>> launchRemote() { #ifndef LLVM_ON_UNIX llvm_unreachable("launchRemote not supported on non-Unix platforms"); #else diff --git a/llvm/tools/llvm-c-test/debuginfo.c b/llvm/tools/llvm-c-test/debuginfo.c index a2f4b3e..9db7aa0 100644 --- a/llvm/tools/llvm-c-test/debuginfo.c +++ b/llvm/tools/llvm-c-test/debuginfo.c @@ -43,6 +43,9 @@ int llvm_test_dibuilder(void) { LLVMMetadataRef File = LLVMDIBuilderCreateFile(DIB, Filename, strlen(Filename), ".", 1); + LLVMMetadataRef FileCS = LLVMDIBuilderCreateFileWithChecksum( + DIB, Filename, strlen(Filename), ".", 1, CSK_MD5, "1234", 4, "source", 6); + LLVMMetadataRef CompileUnit = LLVMDIBuilderCreateCompileUnit( DIB, LLVMDWARFSourceLanguageC, File, "llvm-c-test", 11, 0, NULL, 0, 0, NULL, 0, LLVMDWARFEmissionFull, 0, 0, 0, "/", 1, "", 0); @@ -61,7 +64,7 @@ int llvm_test_dibuilder(void) { "/test/include/llvm-c-test-import.h", 34, "", 0); LLVMMetadataRef ImportedModule = LLVMDIBuilderCreateImportedModuleFromModule( - DIB, Module, OtherModule, File, 42, NULL, 0); + DIB, Module, OtherModule, FileCS, 42, NULL, 0); LLVMDIBuilderCreateImportedModuleFromAlias(DIB, Module, ImportedModule, File, 42, NULL, 0); diff --git a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp index de83a0d..4c08b57 100644 --- a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp +++ b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp @@ -386,7 +386,9 @@ static llvm::Error handleObjectFile(ObjectFile &Obj, const std::string &OutFile, // Make a DWARF transformer object and populate the ranges of the code // so we don't end up adding invalid functions to GSYM data. - DwarfTransformer DT(*DICtx, Gsym, LoadDwarfCallSites); + bool IsMachO = dyn_cast<object::MachOObjectFile>(&Obj) != nullptr; + + DwarfTransformer DT(*DICtx, Gsym, LoadDwarfCallSites, IsMachO); if (!TextRanges.empty()) Gsym.SetValidTextRanges(TextRanges); diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp index 731d648..79216e8 100644 --- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp @@ -40,6 +40,7 @@ #include "llvm/ExecutionEngine/Orc/SectCreate.h" #include "llvm/ExecutionEngine/Orc/SelfExecutorProcessControl.h" #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h" +#include "llvm/ExecutionEngine/Orc/SimpleRemoteMemoryMapper.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderPerf.h" #include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderVTune.h" @@ -312,10 +313,19 @@ static cl::opt<bool> cl::desc("Show FailedToMaterialize errors"), cl::init(false), cl::cat(JITLinkCategory)); -static cl::opt<bool> UseSharedMemory( - "use-shared-memory", - cl::desc("Use shared memory to transfer generated code and data"), - cl::init(false), cl::cat(JITLinkCategory)); +enum class MemMgr { Default, Generic, SimpleRemote, Shared }; + +static cl::opt<MemMgr> UseMemMgr( + "use-memmgr", cl::desc("Choose memory manager"), cl::init(MemMgr::Generic), + cl::values(clEnumValN(MemMgr::Default, "default", + "Use setup default (InProcess or EPCGeneric)"), + clEnumValN(MemMgr::Generic, "generic", + "Generic remote memory manager"), + clEnumValN(MemMgr::SimpleRemote, "simple-remote", + "Mapper memory manager with simple-remote backend"), + clEnumValN(MemMgr::Shared, "shared", + "Mapper memory manager with shared-memory manager")), + cl::cat(JITLinkCategory)); static cl::opt<std::string> OverrideTriple("triple", cl::desc("Override target triple detection"), @@ -623,8 +633,9 @@ public: }); } - char *prepare(ExecutorAddr Addr, size_t ContentSize) override { - return InProcessMemoryMapper::prepare(Addr - DeltaAddr, ContentSize); + char *prepare(jitlink::LinkGraph &G, ExecutorAddr Addr, + size_t ContentSize) override { + return InProcessMemoryMapper::prepare(G, Addr - DeltaAddr, ContentSize); } void initialize(AllocInfo &AI, OnInitializedFunction OnInitialized) override { @@ -717,6 +728,27 @@ static std::unique_ptr<JITLinkMemoryManager> createInProcessMemoryManager() { } Expected<std::unique_ptr<jitlink::JITLinkMemoryManager>> +createSimpleRemoteMemoryManager(SimpleRemoteEPC &SREPC) { + SimpleRemoteMemoryMapper::SymbolAddrs SAs; + if (auto Err = SREPC.getBootstrapSymbols( + {{SAs.Instance, rt::SimpleExecutorMemoryManagerInstanceName}, + {SAs.Reserve, rt::SimpleExecutorMemoryManagerReserveWrapperName}, + {SAs.Initialize, + rt::SimpleExecutorMemoryManagerInitializeWrapperName}, + {SAs.Deinitialize, + rt::SimpleExecutorMemoryManagerDeinitializeWrapperName}, + {SAs.Release, rt::SimpleExecutorMemoryManagerReleaseWrapperName}})) + return std::move(Err); +#ifdef _WIN32 + size_t SlabSize = 1024 * 1024; +#else + size_t SlabSize = 1024 * 1024 * 1024; +#endif + return MapperJITLinkMemoryManager::CreateWithMapper<SimpleRemoteMemoryMapper>( + SlabSize, SREPC, SAs); +} + +Expected<std::unique_ptr<jitlink::JITLinkMemoryManager>> createSharedMemoryManager(SimpleRemoteEPC &SREPC) { SharedMemoryMapper::SymbolAddrs SAs; if (auto Err = SREPC.getBootstrapSymbols( @@ -744,6 +776,19 @@ createSharedMemoryManager(SimpleRemoteEPC &SREPC) { SlabSize, SREPC, SAs); } +static void setupEPCRemoteMemoryManager(SimpleRemoteEPC::Setup &S) { + switch (UseMemMgr) { + case MemMgr::Default: + case MemMgr::Generic: + break; + case MemMgr::SimpleRemote: + S.CreateMemoryManager = createSimpleRemoteMemoryManager; + break; + case MemMgr::Shared: + S.CreateMemoryManager = createSharedMemoryManager; + break; + } +} static Expected<MaterializationUnit::Interface> getTestObjectFileInterface(Session &S, MemoryBufferRef O) { @@ -903,8 +948,7 @@ static Expected<std::unique_ptr<ExecutorProcessControl>> launchExecutor() { close(FromExecutor[WriteEnd]); auto S = SimpleRemoteEPC::Setup(); - if (UseSharedMemory) - S.CreateMemoryManager = createSharedMemoryManager; + setupEPCRemoteMemoryManager(S); return SimpleRemoteEPC::Create<FDSimpleRemoteEPCTransport>( std::make_unique<DynamicThreadPoolTaskDispatcher>(MaterializationThreads), @@ -993,8 +1037,7 @@ static Expected<std::unique_ptr<ExecutorProcessControl>> connectToExecutor() { return SockFD.takeError(); auto S = SimpleRemoteEPC::Setup(); - if (UseSharedMemory) - S.CreateMemoryManager = createSharedMemoryManager; + setupEPCRemoteMemoryManager(S); return SimpleRemoteEPC::Create<FDSimpleRemoteEPCTransport>( std::make_unique<DynamicThreadPoolTaskDispatcher>(std::nullopt), diff --git a/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp b/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp index fa56d0d..fb5c0bf 100644 --- a/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp +++ b/llvm/tools/llvm-mc-assemble-fuzzer/llvm-mc-assemble-fuzzer.cpp @@ -31,6 +31,7 @@ #include "llvm/Support/SourceMgr.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/ToolOutputFile.h" +#include "llvm/Support/VirtualFileSystem.h" #include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/Host.h" #include "llvm/TargetParser/SubtargetFeature.h" @@ -142,6 +143,7 @@ int AssembleOneInput(const uint8_t *Data, size_t Size) { static const std::vector<std::string> NoIncludeDirs; SrcMgr.setIncludeDirs(NoIncludeDirs); + SrcMgr.setVirtualFileSystem(vfs::getRealFileSystem()); static std::string ArchName; std::string Error; diff --git a/llvm/tools/llvm-mc/llvm-mc.cpp b/llvm/tools/llvm-mc/llvm-mc.cpp index 2a89961..3b2d4f8 100644 --- a/llvm/tools/llvm-mc/llvm-mc.cpp +++ b/llvm/tools/llvm-mc/llvm-mc.cpp @@ -40,6 +40,7 @@ #include "llvm/Support/TargetSelect.h" #include "llvm/Support/TimeProfiler.h" #include "llvm/Support/ToolOutputFile.h" +#include "llvm/Support/VirtualFileSystem.h" #include "llvm/Support/WithColor.h" #include "llvm/TargetParser/Host.h" #include <memory> @@ -439,6 +440,7 @@ int main(int argc, char **argv) { // Record the location of the include directories so that the lexer can find // it later. SrcMgr.setIncludeDirs(IncludeDirs); + SrcMgr.setVirtualFileSystem(vfs::getRealFileSystem()); std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TheTriple)); assert(MRI && "Unable to create target register info!"); diff --git a/llvm/tools/llvm-ml/llvm-ml.cpp b/llvm/tools/llvm-ml/llvm-ml.cpp index cda86e7..7b88576 100644 --- a/llvm/tools/llvm-ml/llvm-ml.cpp +++ b/llvm/tools/llvm-ml/llvm-ml.cpp @@ -41,6 +41,7 @@ #include "llvm/Support/SourceMgr.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/ToolOutputFile.h" +#include "llvm/Support/VirtualFileSystem.h" #include "llvm/Support/WithColor.h" #include "llvm/TargetParser/Host.h" #include <ctime> @@ -313,6 +314,7 @@ int llvm_ml_main(int Argc, char **Argv, const llvm::ToolContext &) { } } SrcMgr.setIncludeDirs(IncludeDirs); + SrcMgr.setVirtualFileSystem(vfs::getRealFileSystem()); std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TheTriple)); assert(MRI && "Unable to create target register info!"); diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 46be539d..3ec644a 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -728,11 +728,17 @@ public: } while (!Comments.empty()); FOS.flush(); } + + // Hook invoked when starting to disassemble a symbol at the current position. + // Default is no-op. + virtual void onSymbolStart() {} }; PrettyPrinter PrettyPrinterInst; class HexagonPrettyPrinter : public PrettyPrinter { public: + void onSymbolStart() override { reset(); } + void printLead(ArrayRef<uint8_t> Bytes, uint64_t Address, formatted_raw_ostream &OS) { if (LeadingAddr) @@ -2228,6 +2234,8 @@ disassembleObject(ObjectFile &Obj, const ObjectFile &DbgObj, Start += Size; break; } + // Allow targets to reset any per-symbol state. + DT->Printer->onSymbolStart(); formatted_raw_ostream FOS(OS); Index = Start; if (SectionAddr < StartAddress) diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index ab93316..9c9b2dd 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -8155,6 +8155,8 @@ void LLVMELFDumper<ELFT>::printBBAddrMaps(bool PrettyPGOAnalysis) { W.printHex("Offset", BBE.Offset); if (!BBE.CallsiteEndOffsets.empty()) W.printList("Callsite End Offsets", BBE.CallsiteEndOffsets); + if (PAM.FeatEnable.BBHash) + W.printHex("Hash", BBE.Hash); W.printHex("Size", BBE.Size); W.printBoolean("HasReturn", BBE.hasReturn()); W.printBoolean("HasTailCall", BBE.hasTailCall()); diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp index ef4552f..68e18f6 100644 --- a/llvm/tools/obj2yaml/elf2yaml.cpp +++ b/llvm/tools/obj2yaml/elf2yaml.cpp @@ -900,7 +900,7 @@ ELFDumper<ELFT>::dumpBBAddrMapSection(const Elf_Shdr *Shdr) { while (Cur && Cur.tell() < Content.size()) { if (Shdr->sh_type == ELF::SHT_LLVM_BB_ADDR_MAP) { Version = Data.getU8(Cur); - if (Cur && Version > 3) + if (Cur && Version > 4) return createStringError( errc::invalid_argument, "invalid SHT_LLVM_BB_ADDR_MAP section version: " + @@ -946,8 +946,11 @@ ELFDumper<ELFT>::dumpBBAddrMapSection(const Elf_Shdr *Shdr) { } uint64_t Size = Data.getULEB128(Cur); uint64_t Metadata = Data.getULEB128(Cur); + std::optional<llvm::yaml::Hex64> Hash; + if (FeatureOrErr->BBHash) + Hash = Data.getU64(Cur); BBEntries.push_back( - {ID, Offset, Size, Metadata, std::move(CallsiteEndOffsets)}); + {ID, Offset, Size, Metadata, std::move(CallsiteEndOffsets), Hash}); } TotalNumBlocks += BBEntries.size(); BBRanges.push_back({BaseAddress, /*NumBlocks=*/{}, BBEntries}); |