summaryrefslogtreecommitdiff
path: root/utils/TableGen/TableGen.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-08-01 20:35:01 +0000
committerChris Lattner <sabre@nondot.org>2003-08-01 20:35:01 +0000
commite79c72d4cd68fce6ccb30b2cc222069619f7d503 (patch)
tree7c02823ab993f242146a0127716d3fb18bd0094f /utils/TableGen/TableGen.cpp
parent02f7fa482a4391631c393a747566d4cf748a775c (diff)
downloadllvm-e79c72d4cd68fce6ccb30b2cc222069619f7d503.tar.gz
llvm-e79c72d4cd68fce6ccb30b2cc222069619f7d503.tar.bz2
llvm-e79c72d4cd68fce6ccb30b2cc222069619f7d503.tar.xz
Tablegen should only replace the output if it changes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7486 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/TableGen.cpp')
-rw-r--r--utils/TableGen/TableGen.cpp22
1 files changed, 18 insertions, 4 deletions
diff --git a/utils/TableGen/TableGen.cpp b/utils/TableGen/TableGen.cpp
index 088dcbe0e3..1d8b60bed3 100644
--- a/utils/TableGen/TableGen.cpp
+++ b/utils/TableGen/TableGen.cpp
@@ -11,6 +11,7 @@
#include "Record.h"
#include "Support/CommandLine.h"
#include "Support/Signals.h"
+#include "Support/FileUtilities.h"
#include "CodeEmitterGen.h"
#include "RegisterInfoEmitter.h"
#include <algorithm>
@@ -391,15 +392,18 @@ int main(int argc, char **argv) {
std::ostream *Out = &std::cout;
if (OutputFilename != "-") {
- Out = new std::ofstream(OutputFilename.c_str());
+ // Output to a .tmp file, because we don't actually want to overwrite the
+ // output file unless the generated file is different or the specified file
+ // does not exist.
+ Out = new std::ofstream((OutputFilename+".tmp").c_str());
if (!Out->good()) {
- std::cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
+ std::cerr << argv[0] << ": error opening " << OutputFilename << ".tmp!\n";
return 1;
}
// Make sure the file gets removed if *gasp* tablegen crashes...
- RemoveFileOnSignal(OutputFilename);
+ RemoveFileOnSignal(OutputFilename+".tmp");
}
try {
@@ -438,6 +442,16 @@ int main(int argc, char **argv) {
return 1;
}
- if (Out != &std::cout) delete Out;
+ if (Out != &std::cout) {
+ delete Out; // Close the file
+
+ // Now that we have generated the result, check to see if we either don't
+ // have the requested file, or if the requested file is different than the
+ // file we generated. If so, move the generated file over the requested
+ // file. Otherwise, just remove the file we just generated, so 'make'
+ // doesn't try to regenerate tons of dependencies.
+ //
+ MoveFileOverIfUpdated(OutputFilename+".tmp", OutputFilename);
+ }
return 0;
}