Eliminate some redundancy by relying on raw_fd_ostream to handle "-"

properly.

llvm-svn: 111373
This commit is contained in:
Dan Gohman 2010-08-18 17:55:15 +00:00
parent 083330a8f2
commit 7ba6f22b47
1 changed files with 33 additions and 42 deletions

View File

@ -127,66 +127,57 @@ GetFileNameRoot(const std::string &InputFilename) {
static formatted_raw_ostream *GetOutputStream(const char *TargetName, static formatted_raw_ostream *GetOutputStream(const char *TargetName,
Triple::OSType OS, Triple::OSType OS,
const char *ProgName) { const char *ProgName) {
if (!OutputFilename.empty()) { // If we don't yet have an output filename, make one.
// Make sure that the Out file gets unlinked from the disk if we get a if (OutputFilename.empty()) {
// SIGINT if (InputFilename == "-")
if (OutputFilename != "-") OutputFilename = "-";
sys::RemoveFileOnSignal(sys::Path(OutputFilename)); else {
OutputFilename = GetFileNameRoot(InputFilename);
std::string error; switch (FileType) {
raw_fd_ostream *FDOut = default: assert(0 && "Unknown file type");
new raw_fd_ostream(OutputFilename.c_str(), error, case TargetMachine::CGFT_AssemblyFile:
raw_fd_ostream::F_Binary); if (TargetName[0] == 'c') {
if (!error.empty()) { if (TargetName[1] == 0)
errs() << error << '\n'; OutputFilename += ".cbe.c";
delete FDOut; else if (TargetName[1] == 'p' && TargetName[2] == 'p')
return 0; OutputFilename += ".cpp";
else
OutputFilename += ".s";
} else
OutputFilename += ".s";
break;
case TargetMachine::CGFT_ObjectFile:
if (OS == Triple::Win32)
OutputFilename += ".obj";
else
OutputFilename += ".o";
break;
case TargetMachine::CGFT_Null:
OutputFilename += ".null";
break;
}
} }
formatted_raw_ostream *Out =
new formatted_raw_ostream(*FDOut, formatted_raw_ostream::DELETE_STREAM);
return Out;
} }
if (InputFilename == "-") { // Decide if we need "binary" output.
OutputFilename = "-";
return new formatted_raw_ostream(outs(),
formatted_raw_ostream::PRESERVE_STREAM);
}
OutputFilename = GetFileNameRoot(InputFilename);
bool Binary = false; bool Binary = false;
switch (FileType) { switch (FileType) {
default: assert(0 && "Unknown file type"); default: assert(0 && "Unknown file type");
case TargetMachine::CGFT_AssemblyFile: case TargetMachine::CGFT_AssemblyFile:
if (TargetName[0] == 'c') {
if (TargetName[1] == 0)
OutputFilename += ".cbe.c";
else if (TargetName[1] == 'p' && TargetName[2] == 'p')
OutputFilename += ".cpp";
else
OutputFilename += ".s";
} else
OutputFilename += ".s";
break; break;
case TargetMachine::CGFT_ObjectFile: case TargetMachine::CGFT_ObjectFile:
if (OS == Triple::Win32)
OutputFilename += ".obj";
else
OutputFilename += ".o";
Binary = true;
break;
case TargetMachine::CGFT_Null: case TargetMachine::CGFT_Null:
OutputFilename += ".null";
Binary = true; Binary = true;
break; break;
} }
// Make sure that the Out file gets unlinked from the disk if we get a // Make sure that the Out file gets unlinked from the disk if we get a
// SIGINT // SIGINT
sys::RemoveFileOnSignal(sys::Path(OutputFilename)); if (OutputFilename != "-")
sys::RemoveFileOnSignal(sys::Path(OutputFilename));
// Open the file.
std::string error; std::string error;
unsigned OpenFlags = 0; unsigned OpenFlags = 0;
if (Binary) OpenFlags |= raw_fd_ostream::F_Binary; if (Binary) OpenFlags |= raw_fd_ostream::F_Binary;