DHowett-MSFT added inline comments.

================
Comment at: clang/lib/CodeGen/CGObjCGNU.cpp:188
 
+  Twine ManglePublicSymbol(StringRef Name) {
+    return StringRef(CGM.getTriple().isOSBinFormatCOFF() ? "$_" : "._") + Name;
----------------
DHowett-MSFT wrote:
> As of the latest revision, this now fails at runtime:
> 
> ```
>   0x01342976 (0x03D8D530 0x03D8DCA0 0x04045A08 0x04045A08), 
> llvm::Twine::str() + 0x166 bytes(s), e:\src\llvm\lib\suppor
>   t\twine.cpp, line 29 + 0x5F byte(s)
>   0x01664F99 (0x03D8D5C4 0x0000000A 0x00000000 0x03D8DCA0), `anonymous 
> namespace'::CGObjCGNUstep2::GetClassVar() + 0xB9
>    bytes(s), e:\src\llvm\tools\clang\lib\codegen\cgobjcgnu.cpp, line 1207 + 
> 0x10 byte(s)
> ```
> 
> I believe we're running afoul of StringRef's lifetime here. I haven't had a 
> chance to dig in.
Alright, I don't completely understand why Twine is the way that it is, but 
here:

```
  Twine ManglePublicSymbol(StringRef Name)
```

When we construct `Twine(const char*, StringRef)`, the newly-minted Twine 
contains a _pointer to_ the passed-in StringRef. It's invalid immediately after 
`ManglePublicSymbol` returns. After a few layers of stack pop off, we end up 
with random garbage and undefined behavior.

A quick and effective fix is to switch `Name` to be of type `const Twine&`.

```
  Twine ManglePublicSymbol(const Twine& Name)
```

Name ends up being a twine rvalue with a LHSType of cString, and all is right 
in the world.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D58724



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to