[Lldb-commits] [PATCH] D67774: [Mangle] Add flag to asm labels to disable '\01' prefixing

Aaron Ballman via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Jan 7 10:44:25 PST 2020


aaron.ballman added inline comments.


================
Comment at: cfe/trunk/lib/AST/Mangle.cpp:127
+    // do not add a "\01" prefix.
+    if (!ALA->getIsLiteralLabel() || ALA->getLabel().startswith("llvm.")) {
+      Out << ALA->getLabel();
----------------
Sorry to dredge up an old review, but I recently ran into a bug in this area and am not certain of how to fix it. What should happen if the asm label is a literal which is empty? e.g.,
```
void foo(void) __asm__("");
void foo(void) {}
```
Currently, that seems to get through this code path and stream an empty string into the output stream. However, `writeFuncOrVarName()` doesn't check that it actually wrote anything into the stream when calling `mangleName()` and returns success to the caller. This causes `writeName()` to eventually call `llvm::Mangler::getNameWithPrefix()`, which asserts that the passed `StringRef` is not an empty string and we crash. The typical LLVM code path seems to treat unnamed symbols as being mangled with `__unnamed_N` (where N is replaced), but this relies on having a `GlobalValue*` available to get the next mangling ID.

I'm not certain of where to fix the bug. Should the LLVM side be able to accept an empty string and try to gin up a `GlobalValue*` to mangle it properly? Should the FE side not generate an empty name here? Should empty asm labels be rejected at the source level?

Thanks for any insights you can provide!


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D67774/new/

https://reviews.llvm.org/D67774





More information about the lldb-commits mailing list