diff --git a/llvm/include/llvm/Object/COFFModuleDefinition.h b/llvm/include/llvm/Object/COFFModuleDefinition.h --- a/llvm/include/llvm/Object/COFFModuleDefinition.h +++ b/llvm/include/llvm/Object/COFFModuleDefinition.h @@ -41,7 +41,7 @@ Expected parseCOFFModuleDefinition(MemoryBufferRef MB, COFF::MachineTypes Machine, - bool MingwDef = false); + bool MingwDef = false, bool AddUnderscores = true); } // End namespace object. } // End namespace llvm. diff --git a/llvm/lib/Object/COFFModuleDefinition.cpp b/llvm/lib/Object/COFFModuleDefinition.cpp --- a/llvm/lib/Object/COFFModuleDefinition.cpp +++ b/llvm/lib/Object/COFFModuleDefinition.cpp @@ -138,8 +138,11 @@ class Parser { public: - explicit Parser(StringRef S, MachineTypes M, bool B) - : Lex(S), Machine(M), MingwDef(B) {} + explicit Parser(StringRef S, MachineTypes M, bool B, bool AU) + : Lex(S), Machine(M), MingwDef(B), AddUnderscores(AU) { + if (Machine != IMAGE_FILE_MACHINE_I386) + AddUnderscores = false; + } Expected parse() { do { @@ -234,7 +237,7 @@ unget(); } - if (Machine == IMAGE_FILE_MACHINE_I386) { + if (AddUnderscores) { if (!isDecorated(E.Name, MingwDef)) E.Name = (std::string("_").append(E.Name)); if (!E.ExtName.empty() && !isDecorated(E.ExtName, MingwDef)) @@ -279,7 +282,7 @@ if (Tok.K == EqualEqual) { read(); E.AliasTarget = std::string(Tok.Value); - if (Machine == IMAGE_FILE_MACHINE_I386 && !isDecorated(E.AliasTarget, MingwDef)) + if (AddUnderscores && !isDecorated(E.AliasTarget, MingwDef)) E.AliasTarget = std::string("_").append(E.AliasTarget); continue; } @@ -349,12 +352,14 @@ MachineTypes Machine; COFFModuleDefinition Info; bool MingwDef; + bool AddUnderscores; }; Expected parseCOFFModuleDefinition(MemoryBufferRef MB, MachineTypes Machine, - bool MingwDef) { - return Parser(MB.getBuffer(), Machine, MingwDef).parse(); + bool MingwDef, + bool AddUnderscores) { + return Parser(MB.getBuffer(), Machine, MingwDef, AddUnderscores).parse(); } } // namespace object diff --git a/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp b/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp --- a/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp +++ b/llvm/lib/ToolDrivers/llvm-dlltool/DlltoolDriver.cpp @@ -165,8 +165,9 @@ return 1; } - Expected Def = - parseCOFFModuleDefinition(*MB, Machine, /*MingwDef=*/true); + bool AddUnderscores = !Args.hasArg(OPT_no_leading_underscore); + Expected Def = parseCOFFModuleDefinition( + *MB, Machine, /*MingwDef=*/true, AddUnderscores); if (!Def) { llvm::errs() << "error parsing definition\n" diff --git a/llvm/lib/ToolDrivers/llvm-dlltool/Options.td b/llvm/lib/ToolDrivers/llvm-dlltool/Options.td --- a/llvm/lib/ToolDrivers/llvm-dlltool/Options.td +++ b/llvm/lib/ToolDrivers/llvm-dlltool/Options.td @@ -15,6 +15,9 @@ def k: Flag<["-"], "k">, HelpText<"Kill @n Symbol from export">; def k_alias: Flag<["--"], "kill-at">, Alias; +def no_leading_underscore: Flag<["--"], "no-leading-underscore">, + HelpText<"Don't add leading underscores on symbols">; + //============================================================================== // The flags below do nothing. They are defined only for dlltool compatibility. //============================================================================== diff --git a/llvm/test/tools/llvm-dlltool/no-leading-underscore.def b/llvm/test/tools/llvm-dlltool/no-leading-underscore.def new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-dlltool/no-leading-underscore.def @@ -0,0 +1,19 @@ +; RUN: llvm-dlltool -k -m i386 --input-def %s --output-lib %t.a --no-leading-underscore --kill-at +; RUN: llvm-readobj %t.a | FileCheck %s +; RUN: llvm-nm %t.a | FileCheck %s -check-prefix=CHECK-NM + +LIBRARY test.dll +EXPORTS +func +alias == func +DecoratedFunction@4 + +; CHECK: Name type: name +; CHECK-NEXT: Symbol: __imp_func +; CHECK-NEXT: Symbol: func +; CHECK: Name type: undecorate +; CHECK-NEXT: Symbol: __imp_DecoratedFunction@4 +; CHECK-NEXT: Symbol: DecoratedFunction@4 + +; CHECK-NM: W alias +; CHECK-NM: U func