1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

Filter option names to escape symbols not allowed as C++ identifiers.

Makes it possible to use options with names like "Wa,".
Also fixes the -Wall option handling as a side-effect.

llvm-svn: 50973
This commit is contained in:
Mikhail Glushenkov 2008-05-12 16:33:06 +00:00
parent 0cc6bb7a70
commit 18508c5df4
3 changed files with 37 additions and 8 deletions

12
test/LLVMC/wall.c Normal file
View File

@ -0,0 +1,12 @@
/*
* Check that -Wall works as intended
* RUN: llvmc2 -Wall %s -o %t
* RUN: ./%t | grep hello
*/
#include <stdio.h>
int main() {
printf("hello\n");
return 0;
}

View File

@ -71,7 +71,7 @@ def llvm_gcc_assembler : Tool<
(cmd_line "llvm-gcc -c -x assembler $INFILE -o $OUTFILE"),
(switch_option "c", (stop_compilation),
(help "Compile and assemble, but do not link")),
(prefix_list_option "Wa", (unpack_values), (help "pass options to assembler"))
(prefix_list_option "Wa,", (unpack_values), (help "pass options to assembler"))
]>;
// Default linker
@ -83,7 +83,7 @@ def llvm_gcc_linker : Tool<
(join),
(prefix_list_option "L", (forward), (help "add a directory to link path")),
(prefix_list_option "l", (forward), (help "search a library when linking")),
(prefix_list_option "Wl", (unpack_values), (help "pass options to linker"))
(prefix_list_option "Wl,", (unpack_values), (help "pass options to linker"))
]>;
// Alternative linker for C++
@ -97,7 +97,7 @@ def llvm_gcc_cpp_linker : Tool<
(help "Choose linker (possible values: gcc, g++)")),
(prefix_list_option "L", (forward)),
(prefix_list_option "l", (forward)),
(prefix_list_option "Wl", (unpack_values))
(prefix_list_option "Wl,", (unpack_values))
]>;
// Language map

View File

@ -135,19 +135,36 @@ struct OptionDescription {
}
}
// Escape commas and other symbols not allowed in the C++ variable
// names. Makes it possible to use options with names like "Wa,"
// (useful for prefix options).
std::string EscapeVariableName(const std::string& Var) const {
std::string ret;
for (unsigned i = 0; i != Var.size(); ++i) {
if (Var[i] == ',') {
ret += "_comma_";
}
else {
ret.push_back(Var[i]);
}
}
return ret;
}
std::string GenVariableName() const {
const std::string& EscapedName = EscapeVariableName(Name);
switch (Type) {
case OptionType::Switch:
return "AutoGeneratedSwitch" + Name;
return "AutoGeneratedSwitch" + EscapedName;
case OptionType::Prefix:
return "AutoGeneratedPrefix" + Name;
return "AutoGeneratedPrefix" + EscapedName;
case OptionType::PrefixList:
return "AutoGeneratedPrefixList" + Name;
return "AutoGeneratedPrefixList" + EscapedName;
case OptionType::Parameter:
return "AutoGeneratedParameter" + Name;
return "AutoGeneratedParameter" + EscapedName;
case OptionType::ParameterList:
default:
return "AutoGeneratedParameterList" + Name;
return "AutoGeneratedParameterList" + EscapedName;
}
}